Regression Simulations
linear
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

Classification Simulations
logistic
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

Robust Simulations
linear
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

lss_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

hier_poly_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

linear_lss_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

Correlation Bias Simulations
Main Figures
PVE = 0.1

PVE = 0.4

Number of RF Splits

Entropy Bias Simulations
Main Figures
Average Rank

Number of RF Splits

CCLE Case Study
Summary

Table of Top Genes
|
|
MDI+ (ridge)
|
TreeSHAP
|
MDI
|
MDA
|
MDI-oob
|
|
17-AAG
|
|
1
|
PCSK1N (1.47)
|
PCSK1N (2.19)
|
PCSK1N (2.19)
|
PCSK1N (2.5)
|
PCSK1N (9.16)
|
|
2
|
MMP24 (3.41)
|
MMP24 (4.97)
|
MMP24 (4.06)
|
NQO1 (9.03)
|
MMP24 (194.5)
|
|
3
|
RP11-109D20.2 (4.59)
|
ZSCAN18 (6.94)
|
ZSCAN18 (8.56)
|
ZNF667-AS1 (26.59)
|
ZNF667-AS1 (241.38)
|
|
4
|
ZSCAN18 (8.09)
|
RP11-109D20.2 (7.41)
|
RP11-109D20.2 (10.09)
|
ZSCAN18 (44.03)
|
RP11-109D20.2 (525.22)
|
|
5
|
NQO1 (8.84)
|
NQO1 (9.53)
|
NQO1 (11.81)
|
TST (49.38)
|
SH3BP1 (587.94)
|
|
AEW541
|
|
1
|
TXNDC5 (1.41)
|
TCEAL4 (1.62)
|
TXNDC5 (1.75)
|
TXNDC5 (1.5)
|
TCEAL4 (5.59)
|
|
2
|
ATP8B2 (4.34)
|
TXNDC5 (3.53)
|
ATP8B2 (3.84)
|
ATP8B2 (4.69)
|
IQGAP2 (238.8)
|
|
3
|
VAV2 (6.03)
|
ATP8B2 (8.38)
|
VAV2 (5.41)
|
VAV2 (5.84)
|
RP11-343H19.2 (303.25)
|
|
4
|
TNFRSF17 (8.53)
|
VAV2 (10.47)
|
TCEAL4 (9.44)
|
TCEAL4 (6.5)
|
TXNDC5 (312.62)
|
|
5
|
TCEAL4 (9.03)
|
PLEKHF1 (19.25)
|
TNFRSF17 (9.69)
|
TNFRSF17 (13.56)
|
ATP8B2 (318.59)
|
|
AZD0530
|
|
1
|
PRSS57 (5.16)
|
SYTL1 (17.62)
|
PRSS57 (7.69)
|
PRSS57 (12.09)
|
VTN (105.69)
|
|
2
|
SYTL1 (12.31)
|
PRSS57 (32.5)
|
SYTL1 (42.94)
|
DDAH2 (440.16)
|
SYTL1 (216.62)
|
|
3
|
STXBP2 (15.38)
|
SFTA1P (36.5)
|
NFE2 (43.06)
|
SLC16A9 (484.34)
|
STXBP2 (245.31)
|
|
4
|
NFE2 (23.12)
|
STXBP2 (62.59)
|
STXBP2 (61.62)
|
STXBP2 (486.09)
|
ZBED2 (466.48)
|
|
5
|
THEM4 (34.41)
|
CLDN16 (67.28)
|
SLC16A9 (61.81)
|
RAPGEF3 (514.2)
|
DDAH2 (472.06)
|
|
AZD6244
|
|
1
|
LYZ (1.66)
|
TOR4A (2.31)
|
LYZ (1.72)
|
LYZ (2.53)
|
LYZ (2.09)
|
|
2
|
SPRY2 (2.34)
|
SPRY2 (3.31)
|
RP11-1143G9.4 (3.59)
|
SPRY2 (2.59)
|
RP11-1143G9.4 (3.59)
|
|
3
|
RP11-1143G9.4 (2.84)
|
LYZ (3.69)
|
SPRY2 (3.91)
|
TOR4A (3.25)
|
TOR4A (3.66)
|
|
4
|
ETV4 (5.22)
|
ETV4 (5.19)
|
TOR4A (6.41)
|
RP11-1143G9.4 (4.75)
|
SPRY2 (4.5)
|
|
5
|
TOR4A (6.41)
|
RP11-1143G9.4 (6.84)
|
RNF125 (6.66)
|
ETV4 (6.91)
|
ETV4 (6.34)
|
|
Erlotinib
|
|
1
|
CDH3 (1.47)
|
CDH3 (1.84)
|
CDH3 (2.03)
|
CDH3 (1.97)
|
CDH3 (1.88)
|
|
2
|
RP11-615I2.2 (2.28)
|
RP11-615I2.2 (3.28)
|
RP11-615I2.2 (2.88)
|
RP11-615I2.2 (3.53)
|
RP11-615I2.2 (3.16)
|
|
3
|
EGFR (4.34)
|
SPRR1A (3.97)
|
EGFR (3.97)
|
SPRR1A (6.25)
|
SPRR1A (3.84)
|
|
4
|
SPRR1A (4.44)
|
SYTL1 (7.84)
|
SPRR1A (4.19)
|
GJB3 (8.78)
|
EGFR (8.31)
|
|
5
|
GJB3 (7.44)
|
EGFR (8.69)
|
KRT16 (11.41)
|
EGFR (9.31)
|
SYTL1 (8.72)
|
|
Irinotecan
|
|
1
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
|
2
|
S100A16 (4.12)
|
S100A16 (3.75)
|
S100A16 (3.84)
|
S100A16 (3.25)
|
WWTR1 (6.03)
|
|
3
|
IFITM10 (4.19)
|
IFITM10 (4.09)
|
WWTR1 (4.28)
|
WWTR1 (4.12)
|
TRIM16L (150.38)
|
|
4
|
WWTR1 (4.94)
|
WWTR1 (4.78)
|
IFITM10 (8.03)
|
RP11-359P5.1 (8.22)
|
IFITM10 (163.44)
|
|
5
|
PPIC (7.81)
|
PPIC (10.22)
|
RP11-359P5.1 (8.47)
|
IFITM10 (8.41)
|
S100A16 (182.19)
|
|
L-685458
|
|
1
|
PXK (2.03)
|
DEF6 (4.62)
|
PXK (2.03)
|
PXK (3)
|
PXK (2.94)
|
|
2
|
DEF6 (4.28)
|
PXK (4.94)
|
DEF6 (4.38)
|
IKZF1 (3.44)
|
CXorf21 (4.62)
|
|
3
|
CXorf21 (4.84)
|
CXorf21 (5.44)
|
CXorf21 (5.62)
|
CXorf21 (5.75)
|
DEF6 (4.66)
|
|
4
|
IKZF1 (6.03)
|
IKZF1 (5.75)
|
IKZF1 (7.91)
|
DEF6 (10.31)
|
IKZF1 (5.47)
|
|
5
|
RP11-359P5.1 (9.09)
|
RP11-359P5.1 (9.94)
|
RP11-359P5.1 (12.81)
|
CTNNA1 (13.88)
|
RP11-359P5.1 (10.06)
|
|
LBW242
|
|
1
|
SERPINB6 (1.12)
|
SERPINB6 (1)
|
SERPINB6 (1.66)
|
SERPINB6 (1.31)
|
SERPINB6 (1.56)
|
|
2
|
RGS14 (5.12)
|
RGS14 (6.66)
|
RGS14 (3.66)
|
GPT2 (45.62)
|
HERC5 (54.31)
|
|
3
|
HERC5 (5.41)
|
MAGEC1 (7.5)
|
MAGEC1 (5.53)
|
GBP1 (179.28)
|
ITGA1 (73.34)
|
|
4
|
MAGEC1 (7.62)
|
ITGA1 (10.53)
|
GBP1 (5.78)
|
ZNF32 (222.03)
|
PTGS1 (296.62)
|
|
5
|
GBP1 (8.22)
|
HERC5 (12.41)
|
CCL2 (13.5)
|
IGSF3 (257.88)
|
GPT2 (316.12)
|
|
Lapatinib
|
|
1
|
ERBB2 (1.06)
|
ERBB2 (1.5)
|
ERBB2 (1.41)
|
ERBB2 (1.69)
|
ERBB2 (1.47)
|
|
2
|
PGAP3 (3.09)
|
NA (6.81)
|
PGAP3 (3.44)
|
PGAP3 (8.03)
|
NA (4.31)
|
|
3
|
NA (5.03)
|
PGAP3 (12.41)
|
IKBIP (6.19)
|
C2orf54 (13.09)
|
PGAP3 (14.03)
|
|
4
|
C2orf54 (6.91)
|
DPYSL2 (16.16)
|
NA (6.22)
|
DPYSL2 (15.41)
|
PKP3 (20.31)
|
|
5
|
IKBIP (8.28)
|
PKP3 (16.47)
|
C2orf54 (7.41)
|
EMP3 (20.47)
|
EMP3 (22.38)
|
|
Nilotinib
|
|
1
|
SPN (1.25)
|
SPN (1.81)
|
SPN (1.62)
|
SPN (1.47)
|
SPN (3.59)
|
|
2
|
GPC1 (3.5)
|
GPC1 (4.38)
|
GPC1 (3.5)
|
GPC1 (3.44)
|
SELPLG (9.03)
|
|
3
|
TRDC (6.62)
|
SELPLG (7.5)
|
TRDC (10.16)
|
SELPLG (9.97)
|
KLF13 (26.22)
|
|
4
|
SELPLG (6.78)
|
KLF13 (16.97)
|
LMO2 (10.44)
|
TRDC (10.22)
|
BCL2 (51.09)
|
|
5
|
LMO2 (9.44)
|
TRDC (20.22)
|
CISH (11.03)
|
LMO2 (10.75)
|
GPC1 (166.19)
|
|
Nutlin-3
|
|
1
|
RP11-148O21.4 (1.41)
|
MET (2.53)
|
RP11-148O21.4 (1.59)
|
RP11-148O21.4 (1.72)
|
RAPGEF5 (37)
|
|
2
|
MET (2.53)
|
RP11-148O21.4 (4.75)
|
MET (4.06)
|
LRRC16A (9.56)
|
G6PD (63.53)
|
|
3
|
BLK (5.12)
|
LAYN (6.41)
|
BLK (5.25)
|
BLK (10.97)
|
MET (147.78)
|
|
4
|
LRRC16A (5.16)
|
RPS27L (12.94)
|
LRRC16A (5.97)
|
MET (26.09)
|
BLK (160.06)
|
|
5
|
LAT2 (7.34)
|
ADD3 (21.03)
|
LAT2 (7.78)
|
LAYN (138.84)
|
RP11-148O21.4 (164.94)
|
|
PD-0325901
|
|
1
|
SPRY2 (1.16)
|
SPRY2 (1.53)
|
SPRY2 (1.75)
|
SPRY2 (1.19)
|
SPRY2 (1.75)
|
|
2
|
LYZ (2.72)
|
ETV4 (2.88)
|
LYZ (2.09)
|
LYZ (2.88)
|
LYZ (2.62)
|
|
3
|
ETV4 (2.72)
|
LYZ (3.59)
|
ETV4 (3.66)
|
ETV4 (3.38)
|
ETV4 (3.47)
|
|
4
|
RP11-1143G9.4 (4.34)
|
TOR4A (4.56)
|
RP11-1143G9.4 (4.53)
|
TOR4A (4.72)
|
TOR4A (4.88)
|
|
5
|
PLEKHG4B (5.62)
|
PLEKHG4B (4.66)
|
PLEKHG4B (5.31)
|
RP11-1143G9.4 (5.38)
|
PLEKHG4B (5.5)
|
|
PD-0332991
|
|
1
|
SH2D3C (4.31)
|
SH2D3C (6.81)
|
SH2D3C (4.56)
|
SH2D3C (8)
|
KRT15 (10.56)
|
|
2
|
FMNL1 (6.56)
|
FMNL1 (8.38)
|
HSD3B7 (6.75)
|
AL162151.3 (9.62)
|
HSD3B7 (14.5)
|
|
3
|
HSD3B7 (6.59)
|
AL162151.3 (11.59)
|
FMNL1 (7.09)
|
HSD3B7 (11.03)
|
SEPT6 (16.44)
|
|
4
|
KRT15 (7.19)
|
TWF1 (12.03)
|
KRT15 (7.78)
|
KRT15 (11.97)
|
PPIC (17.03)
|
|
5
|
AL162151.3 (8.84)
|
KRT15 (12.56)
|
TWF1 (8.97)
|
FMNL1 (16.34)
|
AL162151.3 (18.34)
|
|
PF2341066
|
|
1
|
ENAH (1.03)
|
ENAH (1)
|
ENAH (1.31)
|
ENAH (1.12)
|
ENAH (1.06)
|
|
2
|
SELPLG (2.09)
|
SELPLG (2.81)
|
SELPLG (2.06)
|
SELPLG (2.28)
|
SELPLG (2.47)
|
|
3
|
HGF (3.62)
|
HGF (3.94)
|
MET (5.44)
|
HGF (7.03)
|
CTD-2020K17.3 (10.31)
|
|
4
|
CTD-2020K17.3 (9.72)
|
CTD-2020K17.3 (9.41)
|
HGF (6)
|
MET (10.69)
|
HGF (14.06)
|
|
5
|
MET (10.53)
|
MET (11.5)
|
MLKL (12)
|
CTD-2020K17.3 (11.88)
|
DOK2 (14.41)
|
|
PHA-665752
|
|
1
|
ARHGAP4 (1)
|
ARHGAP4 (1.06)
|
ARHGAP4 (1.06)
|
ARHGAP4 (1.09)
|
ARHGAP4 (1)
|
|
2
|
CTD-2020K17.3 (2.88)
|
CTD-2020K17.3 (2.66)
|
CTD-2020K17.3 (4.25)
|
CTD-2020K17.3 (2.56)
|
FMNL1 (4.22)
|
|
3
|
FMNL1 (4.88)
|
FMNL1 (7.44)
|
PFN2 (10.84)
|
PFN2 (24.31)
|
CTD-2020K17.3 (5.44)
|
|
4
|
PFN2 (8.06)
|
PGPEP1 (13.28)
|
FMNL1 (11.78)
|
FMNL1 (33.12)
|
INHBB (216.5)
|
|
5
|
PGPEP1 (10.12)
|
INHBB (18.88)
|
FDFT1 (18.66)
|
MICB (59.69)
|
PGPEP1 (335.97)
|
|
PLX4720
|
|
1
|
RXRG (1)
|
RXRG (1.16)
|
RXRG (1)
|
RXRG (1)
|
RXRG (1.03)
|
|
2
|
MMP8 (5.19)
|
MMP8 (3.97)
|
MMP8 (5.16)
|
MMP8 (5.56)
|
MMP8 (4.88)
|
|
3
|
RP11-164J13.1 (6.28)
|
RP11-599J14.2 (7.22)
|
MYO5A (7.09)
|
MYO5A (6.81)
|
MYO5A (8.75)
|
|
4
|
RP11-599J14.2 (7)
|
AP1S2 (8.47)
|
LYST (7.97)
|
LYST (11.31)
|
AP1S2 (10.53)
|
|
5
|
RP4-718J7.4 (7.84)
|
LYST (9.34)
|
RP11-599J14.2 (8.41)
|
RP4-718J7.4 (13.22)
|
RP11-599J14.2 (12.69)
|
|
Paclitaxel
|
|
1
|
MMP24 (1.09)
|
MMP24 (1.28)
|
MMP24 (1.22)
|
MMP24 (2.38)
|
SH3BP1 (10.38)
|
|
2
|
AGAP2 (3.16)
|
SH3BP1 (2.75)
|
AGAP2 (3.44)
|
SH3BP1 (2.88)
|
PRODH (60.41)
|
|
3
|
SH3BP1 (3.5)
|
AGAP2 (4.06)
|
SH3BP1 (3.78)
|
SLC38A5 (3.84)
|
AGAP2 (157.41)
|
|
4
|
SLC38A5 (4.34)
|
SLC38A5 (4.22)
|
PTTG1IP (3.91)
|
AGAP2 (5.88)
|
SLC38A5 (179.34)
|
|
5
|
PTTG1IP (4.72)
|
PTTG1IP (4.34)
|
SLC38A5 (4.31)
|
PTTG1IP (6.97)
|
MMP24 (308.66)
|
|
Panobinostat
|
|
1
|
AGAP2 (1.12)
|
AGAP2 (1.56)
|
AGAP2 (1.81)
|
AGAP2 (2.16)
|
CYR61 (2.56)
|
|
2
|
CYR61 (2.44)
|
CYR61 (2.09)
|
CYR61 (2.16)
|
CYR61 (2.78)
|
AGAP2 (3.25)
|
|
3
|
RPL39P5 (4.19)
|
RPL39P5 (4.41)
|
RPL39P5 (3.75)
|
RPL39P5 (3.88)
|
RPL39P5 (152.44)
|
|
4
|
WWTR1 (5.16)
|
WWTR1 (5.78)
|
WWTR1 (5.94)
|
WWTR1 (6.53)
|
S100A2 (316.66)
|
|
5
|
MYOF (6.56)
|
MYOF (6.16)
|
IKZF1 (12.41)
|
IKZF1 (9.72)
|
MYOF (366.28)
|
|
RAF265
|
|
1
|
CMTM3 (1.34)
|
CMTM3 (1.5)
|
CMTM3 (1.69)
|
SH2B3 (34)
|
CMTM3 (7.06)
|
|
2
|
SYT17 (5.69)
|
SYT17 (5.66)
|
SYT17 (7.69)
|
CMTM3 (155.25)
|
SH2B3 (470.66)
|
|
3
|
SH2B3 (6.03)
|
SH2B3 (8.91)
|
SH2B3 (17.5)
|
SLC29A3 (159)
|
SYT17 (652.84)
|
|
4
|
EMILIN2 (11.94)
|
SLC29A3 (11.84)
|
STAT5A (19.66)
|
PRKCQ (235)
|
RGS16 (713.47)
|
|
5
|
STAT5A (12.47)
|
NA (19.91)
|
SLC29A3 (22.22)
|
LCP2 (259.7)
|
AC007620.3 (1087.11)
|
|
Sorafenib
|
|
1
|
PXK (4.47)
|
TP63 (6.72)
|
PXK (4.12)
|
FAM212A (6.41)
|
PXK (9.34)
|
|
2
|
P2RX1 (4.62)
|
P2RX1 (7.78)
|
FAM212A (5.75)
|
P2RX1 (8)
|
ARHGAP9 (34.25)
|
|
3
|
FAM212A (4.69)
|
PXK (8.88)
|
STAC3 (7.16)
|
SEC31B (41.69)
|
P2RX1 (156.91)
|
|
4
|
STAC3 (5.16)
|
FAM212A (16.97)
|
P2RX1 (7.25)
|
ARHGAP9 (43.19)
|
FAM212A (187.31)
|
|
5
|
ARHGAP9 (7.91)
|
STAC3 (20.16)
|
TP63 (40.97)
|
CXCL8 (57.72)
|
SEC31B (222.41)
|
|
TAE684
|
|
1
|
SELPLG (1.09)
|
SELPLG (1.06)
|
SELPLG (1.12)
|
SELPLG (1.03)
|
SELPLG (1.34)
|
|
2
|
IL6R (3.19)
|
ARID3A (8.12)
|
IL6R (3.34)
|
IL6R (6.41)
|
ARID3A (18.31)
|
|
3
|
NFIL3 (6.34)
|
GALNT18 (8.62)
|
NFIL3 (6.25)
|
NFIL3 (8.06)
|
FMNL1 (25.25)
|
|
4
|
ARID3A (7)
|
IL6R (10.16)
|
RRAS2 (10.19)
|
ARID3A (16.38)
|
RP11-334A14.2 (144.34)
|
|
5
|
RRAS2 (8.66)
|
PPP2R3A (15.69)
|
FMNL1 (10.19)
|
RRAS2 (17.97)
|
PPP2R3A (165.84)
|
|
TKI258
|
|
1
|
TWF1 (2.44)
|
TWF1 (3.31)
|
TWF1 (2.41)
|
TWF1 (2.28)
|
LAPTM5 (20.84)
|
|
2
|
SLC43A1 (2.88)
|
GPR162 (3.75)
|
PRTN3 (3.31)
|
LAPTM5 (5.34)
|
SLC43A1 (156.12)
|
|
3
|
PRTN3 (5.25)
|
SLC43A1 (6.84)
|
SLC43A1 (6.06)
|
PRTN3 (6.12)
|
TWF1 (163.78)
|
|
4
|
LAPTM5 (5.78)
|
TTC28 (8.94)
|
LAT2 (6.62)
|
SLC43A1 (14.91)
|
GPR162 (169.66)
|
|
5
|
LAT2 (5.94)
|
LAPTM5 (11.53)
|
LAPTM5 (8.19)
|
LAT2 (17.41)
|
LYL1 (387.97)
|
|
Topotecan
|
|
1
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
|
2
|
HSPB8 (2.16)
|
HSPB8 (2.28)
|
HSPB8 (2.84)
|
HSPB8 (2.06)
|
HSPB8 (2.62)
|
|
3
|
PPIC (5.69)
|
OSGIN1 (5.28)
|
OSGIN1 (5.31)
|
PPIC (7.81)
|
OSGIN1 (7.19)
|
|
4
|
OSGIN1 (5.88)
|
AGAP2 (8.81)
|
PPIC (6.81)
|
RP11-359P5.1 (10.75)
|
AGAP2 (15.25)
|
|
5
|
AGAP2 (6.53)
|
PPIC (8.91)
|
RP11-359P5.1 (8.25)
|
CORO1A (12.06)
|
HMGB2 (21.53)
|
|
ZD-6474
|
|
1
|
MAP3K12 (1)
|
MAP3K12 (1)
|
MAP3K12 (1)
|
MAP3K12 (1.09)
|
MAP3K12 (1)
|
|
2
|
PIM1 (5.47)
|
CTSH (21.88)
|
PIM1 (10.28)
|
PIM1 (31.44)
|
SCD5 (339.58)
|
|
3
|
PRKCQ (9.03)
|
TIMP1 (26.31)
|
PRKCQ (15.28)
|
DYNLT3 (192.12)
|
ITGA10 (527.41)
|
|
4
|
CTSH (12.91)
|
PRKCQ (26.47)
|
CTSH (18.16)
|
TIMP1 (211.25)
|
TIMP1 (569.81)
|
|
5
|
ITGA10 (20.81)
|
PIM1 (33.81)
|
ANXA5 (78.78)
|
EPHA1 (320.22)
|
CTSH (631.5)
|
17-AAG


AEW541


AZD0530


AZD6244


Erlotinib


Irinotecan


L-685458


LBW242


Lapatinib


Nilotinib


Nutlin-3


PD-0325901


PD-0332991


PF2341066


PHA-665752


PLX4720


Paclitaxel


Panobinostat


RAF265


Sorafenib


TAE684


TKI258


Topotecan


ZD-6474


TCGA BRCA Case Study
Non-zero Stability Scores Per Method

Stability of Top Features

Table of Top Genes
|
Rank
|
MDI+ (ridge)
|
MDI+ (logistic)
|
MDA
|
TreeSHAP
|
MDI
|
|
1
|
ESR1 (1.91)
|
ESR1 (1.91)
|
ESR1 (4.5)
|
ESR1 (7.62)
|
ESR1 (13.91)
|
|
2
|
FOXA1 (4.25)
|
GATA3 (4.5)
|
GATA3 (6.38)
|
TPX2 (10.41)
|
TPX2 (15.34)
|
|
3
|
FOXC1 (6.12)
|
FOXA1 (5.09)
|
FOXA1 (8.11)
|
GATA3 (19.62)
|
FOXM1 (22.84)
|
|
4
|
GATA3 (6.97)
|
TPX2 (6.81)
|
TPX2 (10.12)
|
FOXM1 (20.06)
|
MLPH (24.97)
|
|
5
|
AGR3 (7.94)
|
AGR3 (10.22)
|
MLPH (10.16)
|
FOXA1 (20.72)
|
FOXA1 (25.66)
|
|
6
|
MLPH (8.16)
|
FOXC1 (12.94)
|
AGR3 (12.94)
|
CDK1 (22.38)
|
GATA3 (30.44)
|
|
7
|
TPX2 (11.03)
|
MLPH (15.69)
|
TBC1D9 (14.22)
|
MLPH (22.53)
|
CDK1 (31.41)
|
|
8
|
TBC1D9 (14.44)
|
FOXM1 (18.12)
|
FOXC1 (15.09)
|
AGR3 (25.88)
|
THSD4 (34.69)
|
|
9
|
FOXM1 (18.66)
|
TBC1D9 (21.03)
|
FOXM1 (19.88)
|
PLK1 (28.47)
|
FOXC1 (35)
|
|
10
|
THSD4 (21.78)
|
THSD4 (23.66)
|
THSD4 (21.28)
|
TBC1D9 (29.84)
|
TBC1D9 (35.44)
|
|
11
|
SPDEF (25.81)
|
CDK1 (24.44)
|
CDK1 (21.77)
|
FOXC1 (30.44)
|
AGR3 (36.44)
|
|
12
|
CA12 (29.44)
|
MYBL2 (25.34)
|
XBP1 (24.88)
|
MYBL2 (33.06)
|
PLK1 (36.81)
|
|
13
|
CDK1 (36.09)
|
RACGAP1 (26.81)
|
KIF2C (27.95)
|
THSD4 (33.53)
|
MYBL2 (45.22)
|
|
14
|
GABRP (36.72)
|
ASPM (27.56)
|
PLK1 (28.58)
|
KIF2C (35.56)
|
KIF2C (46.22)
|
|
15
|
PLK1 (37.97)
|
PLK1 (28.84)
|
MYBL2 (30.97)
|
ASPM (40.59)
|
ASPM (49.72)
|
|
16
|
FAM171A1 (38.59)
|
UBE2C (30.41)
|
GABRP (31.94)
|
GMPS (41.41)
|
GMPS (52.03)
|
|
17
|
ASPM (39.5)
|
SPAG5 (31.81)
|
ASPM (35.97)
|
XBP1 (50.44)
|
SPDEF (58.88)
|
|
18
|
SFRP1 (40.25)
|
GMPS (35.34)
|
FAM171A1 (38.55)
|
CENPF (56.69)
|
FAM171A1 (68.56)
|
|
19
|
XBP1 (40.44)
|
KIF2C (36.03)
|
CA12 (40.16)
|
MKI67 (59.69)
|
CA12 (69.59)
|
|
20
|
MYBL2 (43.12)
|
CA12 (37.31)
|
CDC20 (48.45)
|
CA12 (59.91)
|
UBE2C (69.78)
|
|
21
|
TFF3 (43.12)
|
RRM2 (46.09)
|
SPDEF (53.05)
|
RACGAP1 (60.53)
|
TFF3 (70)
|
|
22
|
KIF2C (44.62)
|
CENPF (46.31)
|
UBE2C (54.27)
|
SPAG5 (61.94)
|
CENPF (70.31)
|
|
23
|
PRR15 (44.88)
|
GABRP (47.59)
|
ANXA9 (55.41)
|
FAM171A1 (63)
|
RACGAP1 (70.94)
|
|
24
|
AGR2 (45)
|
SFRP1 (49.34)
|
C1orf64 (57.22)
|
KIF11 (63.56)
|
SPAG5 (71.81)
|
|
25
|
MIA (45.31)
|
XBP1 (49.78)
|
RACGAP1 (57.97)
|
ANLN (64.28)
|
KIF11 (73.12)
|
Prediction using Top Features

Misspecified Models
linear
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

Varying Sparsity
linear
juvenile

splicing

lss_3m_2r
juvenile

splicing

hier_poly_3m_2r
juvenile

splicing

linear_lss_3m_2r
juvenile

splicing

Varying # Features
linear
ccle_rnaseq

lss_3m_2r
ccle_rnaseq

hier_poly_3m_2r
ccle_rnaseq

linear_lss_3m_2r
ccle_rnaseq

Prediction Results

MDI+ Modeling Choices
linear
enhancer
min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq
min_samples_per_leaf = 5

min_samples_per_leaf = 1

hier_poly_3m_2r
enhancer
min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq
min_samples_per_leaf = 5

min_samples_per_leaf = 1

MDI+ GLM/Metric Choices
Held-out Test Prediction Scores
linear
enhancer

ccle_rnaseq

hier_poly_3m_2r
enhancer

ccle_rnaseq

Stability Scores - Regression
linear
enhancer


ccle_rnaseq


hier_poly_3m_2r
enhancer


ccle_rnaseq


Stability Scores - Classification
logistic
juvenile


splicing


hier_poly_3m_2r_logistic
juvenile


splicing


LS0tCnRpdGxlOiAiTURJKyBTaW11bGF0aW9uIFJlc3VsdHMgU3VtbWFyeSIKYXV0aG9yOiAiIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlZCwgJVknKWAiCm91dHB1dDogdnRoZW1lczo6dm1vZGVybgpwYXJhbXM6CiAgcmVzdWx0c19kaXI6IAogICAgbGFiZWw6ICJSZXN1bHRzIGRpcmVjdG9yeSIKICAgIHZhbHVlOiAiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9yZXN1bHRzX2ZpbmFsLyIKICBzZWVkOgogICAgbGFiZWw6ICJTZWVkIgogICAgdmFsdWU6IDEyMzQ1CiAgZm9yX3BhcGVyOgogICAgbGFiZWw6ICJFeHBvcnQgcGxvdHMgZm9yIHBhcGVyIgogICAgdmFsdWU6IEZBTFNFCiAgdXNlX2NhY2hlZDoKICAgIGxhYmVsOiAiVXNlIGNhY2hlZCAucmRzIGZpbGVzIgogICAgdmFsdWU6IFRSVUUKICBpbnRlcmFjdGl2ZToKICAgIGxhYmVsOiAiSW50ZXJhY3RpdmUgcGxvdHMiCiAgICB2YWx1ZTogRkFMU0UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHBhdGNod29yaykKY2h1bmtfaWR4IDwtIDEKCiMgc2V0IHBhcmFtZXRlcnMKcmVzdWx0c19kaXIgPC0gcGFyYW1zJHJlc3VsdHNfZGlyCnNlZWQgPC0gcGFyYW1zJHNlZWQKdGFibGVzX2RpciA8LSBmaWxlLnBhdGgoInRhYmxlcyIpCmZpZ3VyZXNfZGlyIDwtIGZpbGUucGF0aCgiZmlndXJlcyIpCmZpZ3VyZXNfc3ViZGlycyA8LSBjKCJyZWdyZXNzaW9uX3NpbXMiLCAiY2xhc3NpZmljYXRpb25fc2ltcyIsICJyb2J1c3Rfc2ltcyIsCiAgICAgICAgICAgICAgICAgICAgICJtaXNzcGVjaWZpZWRfcmVncmVzc2lvbl9zaW1zIiwgInZhcnlpbmdfc3BhcnNpdHkiLAogICAgICAgICAgICAgICAgICAgICAidmFyeWluZ19wIiwgIm1vZGVsaW5nX2Nob2ljZXMiLCAiZ2xtX21ldHJpY19jaG9pY2VzIikKZm9yIChmaWd1cmVzX3N1YmRpciBpbiBmaWd1cmVzX3N1YmRpcnMpIHsKICBpZiAoIWRpci5leGlzdHMoZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCBmaWd1cmVzX3N1YmRpcikpKSB7CiAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChmaWd1cmVzX2RpciwgZmlndXJlc19zdWJkaXIpLCByZWN1cnNpdmUgPSBUUlVFKQogIH0KfQoKIyBtaXNjZWxsYW5lb3VzIGhlbHBlciB2YXJpYWJsZXMKaGVyaXRhYmlsaXRpZXMgPC0gYygwLjEsIDAuMiwgMC40LCAwLjgpCmZyYWNfbGFiZWxfY29ycnVwdGlvbnMgPC0gYygiMC4yNSIsICIwLjE1IiwgIjAuMDUiLCAiMCIpCmNvcnJ1cHRfc2l6ZXMgPC0gYygwLjA1LCAwLjAyNSwgMC4wMSwgMCkKbWVhbl9zaGlmdHMgPC0gYygxMCwgMjUpCm1ldHJpYyA8LSAicm9jYXVjIgoKIyBwbG90IG9wdGlvbnMKcG9pbnRfc2l6ZSA8LSAyCmxpbmVfc2l6ZSA8LSAxCmVycmJhcl93aWR0aCA8LSAwCmlmIChwYXJhbXMkaW50ZXJhY3RpdmUpIHsKICBwbG90X2Z1biA8LSBwbG90bHk6OmdncGxvdGx5Cn0gZWxzZSB7CiAgcGxvdF9mdW4gPC0gZnVuY3Rpb24oeCkgeAp9CgptYW51YWxfY29sb3JfcGFsZXR0ZV9jaG9pY2VzIDwtIGMoCiAgImJsYWNrIiwgImJsYWNrIiwgIiM5QjVERkYiLCAiYmx1ZSIsCiAgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIKKQpzaG93X21ldGhvZHNfY2hvaWNlcyA8LSBjKAogICJHTURJX3JpZGdlX1JGIiwgIkdNRElfcmlkZ2VfbG9vX3IyX1JGIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zc19SRiIsICJHTURJX0h1YmVyX2xvb19odWJlcl9sb3NzX1JGIiwKICAiTURBX1JGIiwgIk1ESV9SRiIsICJNREktb29iX1JGIiwgIlRyZWVTSEFQX1JGIgopCm1ldGhvZF9sYWJlbHNfY2hvaWNlcyA8LSBjKAogICJNREkrIChyaWRnZSkiLCAiTURJKyAocmlkZ2UpIiwgIk1ESSsgKGxvZ2lzdGljKSIsICJNREkrIChIdWJlcikiLAogICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiCikKY29sb3JfZGYgPC0gdGliYmxlOjp0aWJibGUoCiAgY29sb3IgPSBtYW51YWxfY29sb3JfcGFsZXR0ZV9jaG9pY2VzLAogIG5hbWUgPSBzaG93X21ldGhvZHNfY2hvaWNlcywKICBsYWJlbCA9IG1ldGhvZF9sYWJlbHNfY2hvaWNlcwopCgptYW51YWxfY29sb3JfcGFsZXR0ZV9hbGwgPC0gTlVMTApzaG93X21ldGhvZHNfYWxsIDwtIE5VTEwKbWV0aG9kX2xhYmVsc19hbGwgPC0gZ2dwbG90Mjo6d2FpdmVyKCkKCmN1c3RvbV90aGVtZSA8LSB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJwbGFpbiIpLAogIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKQogICMgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iLCBoanVzdCA9IDAuNSkKKQpjdXN0b21fdGhlbWVfd2l0aF9sZWdlbmQgPC0gdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogIGxlZ2VuZC50ZXh0LmFsaWduID0gMCwKICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpCikKY3VzdG9tX3RoZW1lX3dpdGhvdXRfbGVnZW5kIDwtIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJwbGFpbiIpLAogIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgbGVnZW5kLnRleHQuYWxpZ24gPSAwLAogIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkKKQoKZmlnX2hlaWdodCA8LSA2CmZpZ193aWR0aCA8LSAxMAoKc291cmNlKCIuLi8uLi9zY3JpcHRzL3Zpei5SIiwgY2hkaXIgPSBUUlVFKQpgYGAKCgojIFJlZ3Jlc3Npb24gU2ltdWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjM1KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIHlfbW9kZWxzCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgXG5cbiIsIHhfbW9kZWwpKQogICAgcGx0X2xzIDwtIGxpc3QoKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoIm1kaV9wbHVzLnJlZ3Jlc3Npb25fc2ltcy4iLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICApCiAgICAgICAgaWYgKGggIT0gaGVyaXRhYmlsaXRpZXNbMV0pIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGlmICh4X21vZGVsICVpbiUgcmVtb3ZlX3hfYXhpc19tb2RlbHMpIHsKICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgIH0KICAgICAgICBpZiAoISgoaCA9PSBoZXJpdGFiaWxpdGllc1tsZW5ndGgoaGVyaXRhYmlsaXRpZXMpXSkgJiAKICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgfQogICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgIH0KICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicmVncmVzc2lvbl9zaW1zIiwKICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQoKYGBgCgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KeV9tb2RlbHMgPC0gYygibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIpCnhfbW9kZWxzIDwtIGMoInNwbGljaW5nIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoImxzc18zbV8yciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIHhfbW9kZWxzCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxzc18zbV8yciIpCgppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogICAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICAgIHBsdF9scyA8LSBsaXN0KCkKICAgICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICAgICkKICAgICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgICApCiAgICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJtZGlfcGx1cy5yZWdyZXNzaW9uX3NpbXMuIiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgKQogICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeV9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgIH0KICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICB9CiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgInJlZ3Jlc3Npb25fc2ltcyIsCiAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1haW5fcmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfQogIH0KfQoKYGBgCgoKIyBDbGFzc2lmaWNhdGlvbiBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zc19SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjQpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImZyYWNfbGFiZWxfY29ycnVwdGlvbl9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxvZ2lzdGljIiwgImxzc18zbV8ycl9sb2dpc3RpYyIsICJoaWVyX3BvbHlfM21fMnJfbG9naXN0aWMiLCAibGluZWFyX2xzc18zbV8ycl9sb2dpc3RpYyIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIiwgImp1dmVuaWxlIiwgInNwbGljaW5nIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIiwgImp1dmVuaWxlIikKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiKQprZWVwX2xlZ2VuZF95X21vZGVscyA8LSB5X21vZGVscwoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJtZGlfcGx1cy5jbGFzc2lmaWNhdGlvbl9zaW1zLiIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZm9yIChoIGluIGZyYWNfbGFiZWxfY29ycnVwdGlvbnMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoZnJhY19sYWJlbF9jb3JydXB0aW9uX25hbWUgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICApCiAgICAgICAgaWYgKGggIT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGZyYWNfbGFiZWxfY29ycnVwdGlvbnNbbGVuZ3RoKGZyYWNfbGFiZWxfY29ycnVwdGlvbnMpXSkgJiAKICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgfQogICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgIH0KICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiY2xhc3NpZmljYXRpb25fc2ltcyIsCiAgICAgICAgICAgICAgICAgIHNwcmludGYoImNsYXNzaWZpY2F0aW9uX3NpbXNfJXNfJXNfJXNfZXJyYmFycy5wZGYiLCB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImZyYWNfbGFiZWxfY29ycnVwdGlvbl9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICB9CiAgfQp9CmBgYAoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CnlfbW9kZWxzIDwtIGMoImxvZ2lzdGljIiwgImxpbmVhcl9sc3NfM21fMnJfbG9naXN0aWMiKQp4X21vZGVscyA8LSBjKCJjY2xlX3JuYXNlcSIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJsb2dpc3RpYyIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIHhfbW9kZWxzCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxvZ2lzdGljIikKCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgICAgcGx0X2xzIDwtIGxpc3QoKQogICAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICAgKQogICAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICAgICkKICAgICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoIm1kaV9wbHVzLmNsYXNzaWZpY2F0aW9uX3NpbXMuIiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgICBmb3IgKGggaW4gZnJhY19sYWJlbF9jb3JydXB0aW9ucykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBmcmFjX2xhYmVsX2NvcnJ1cHRpb25zWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeV9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1tsZW5ndGgoZnJhY19sYWJlbF9jb3JydXB0aW9ucyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjbGFzc2lmaWNhdGlvbl9zaW1zIiwKICAgICAgICAgICAgICAgICAgc3ByaW50ZigibWFpbl9jbGFzc2lmaWNhdGlvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfQogIH0KfQpgYGAKCgojIFJvYnVzdCBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX2xvb19yMl9SRiIsICJHTURJX0h1YmVyX2xvb19odWJlcl9sb3NzX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMikpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiY29ycnVwdF9zaXplX3NhbXBsZV9yb3dfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoMTApCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQprZWVwX2xlZ2VuZF9tZWFuX3NoaWZ0cyA8LSBjKDEwKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1jaXJjbGV9IFxuXG4iLCB4X21vZGVsKSkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIGZvciAobWVhbl9zaGlmdCBpbiBtZWFuX3NoaWZ0cykgewogICAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyMgTWVhbiBTaGlmdCA9ICVzIFxuXG4iLCBtZWFuX3NoaWZ0KSkKICAgICAgcGx0X2xzIDwtIGxpc3QoKQogICAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc18lc01TX3JvYnVzdF9kZ3AiLCB4X21vZGVsLCB5X21vZGVsLCBtZWFuX3NoaWZ0KQogICAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgibWRpX3BsdXMucm9idXN0X3NpbXMuIiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiLAogICAgICAgIFRSVUUgfiBtZXRyaWMKICAgICAgKQogICAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICAgIHRtcCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihjb3JydXB0X3NpemVfbmFtZSAlaW4lIGNvcnJ1cHRfc2l6ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCAlaW4lIHNob3dfbWV0aG9kcykgJT4lCiAgICAgICAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlX3Jvd19uLCBjb3JydXB0X3NpemVfbmFtZSwgbWV0aG9kKSAlPiUKICAgICAgICAgIGRwbHlyOjpzdW1tYXJpc2UobWVhbiA9IG1lYW4oLmRhdGFbW21ldHJpY11dKSkKICAgICAgICBtaW5feSA8LSBtaW4odG1wJG1lYW4pCiAgICAgICAgbWF4X3kgPC0gbWF4KHRtcCRtZWFuKQogICAgICAgIGZvciAoaCBpbiBjb3JydXB0X3NpemVzKSB7CiAgICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb3JydXB0X3NpemVfbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICAgKQogICAgICAgICAgaWYgKGggIT0gY29ycnVwdF9zaXplc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKG1lYW5fc2hpZnQgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGNvcnJ1cHRfc2l6ZXNbbGVuZ3RoKGNvcnJ1cHRfc2l6ZXMpXSkgJiAKICAgICAgICAgICAgICAgIChtZWFuX3NoaWZ0ICVpbiUga2VlcF9sZWdlbmRfbWVhbl9zaGlmdHMpICYKICAgICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgICB9CiAgICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICAgIH0KICAgICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicm9idXN0X3NpbXMiLAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoInJvYnVzdF9zaW1zXyVzXyVzXyVzTVNfJXNfZXJyYmFycy5wZGYiLCB5X21vZGVsLCB4X21vZGVsLCBtZWFuX3NoaWZ0LCBtZXRyaWMpKSwKICAgICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICAgKQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9ICJjb3JydXB0X3NpemVfbmFtZSIsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICAgICkKICAgICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgICAgfQogICAgfQogIH0KfQoKYGBgCgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KeV9tb2RlbHMgPC0gYygibHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygxMCkKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0geF9tb2RlbHMKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0geV9tb2RlbHMKa2VlcF9sZWdlbmRfbWVhbl9zaGlmdHMgPC0gYygxMCkKCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICAgICkKICAgICAgZm9yIChtZWFuX3NoaWZ0IGluIG1lYW5fc2hpZnRzKSB7CiAgICAgICAgcGx0X2xzIDwtIGxpc3QoKQogICAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzXyVzTVNfcm9idXN0X2RncCIsIHhfbW9kZWwsIHlfbW9kZWwsIG1lYW5fc2hpZnQpCiAgICAgICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoIm1kaV9wbHVzLnJvYnVzdF9zaW1zLiIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgICB9CiAgICAgICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIsCiAgICAgICAgICBUUlVFIH4gbWV0cmljCiAgICAgICAgKQogICAgICAgIHRtcCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihjb3JydXB0X3NpemVfbmFtZSAlaW4lIGNvcnJ1cHRfc2l6ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCAlaW4lIHNob3dfbWV0aG9kcykgJT4lCiAgICAgICAgICBkcGx5cjo6Z3JvdXBfYnkoc2FtcGxlX3Jvd19uLCBjb3JydXB0X3NpemVfbmFtZSwgbWV0aG9kKSAlPiUKICAgICAgICAgIGRwbHlyOjpzdW1tYXJpc2UobWVhbiA9IG1lYW4oLmRhdGFbW21ldHJpY11dKSkKICAgICAgICBtaW5feSA8LSBtaW4odG1wJG1lYW4pCiAgICAgICAgbWF4X3kgPC0gbWF4KHRtcCRtZWFuKQogICAgICAgIGZvciAoaCBpbiBjb3JydXB0X3NpemVzKSB7CiAgICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb3JydXB0X3NpemVfbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICAgKQogICAgICAgICAgaWYgKGggIT0gY29ycnVwdF9zaXplc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKG1lYW5fc2hpZnQgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGNvcnJ1cHRfc2l6ZXNbbGVuZ3RoKGNvcnJ1cHRfc2l6ZXMpXSkgJiAKICAgICAgICAgICAgICAgIChtZWFuX3NoaWZ0ICVpbiUga2VlcF9sZWdlbmRfbWVhbl9zaGlmdHMpICYKICAgICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgICB9CiAgICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICAgIH0KICAgICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicm9idXN0X3NpbXMiLAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1haW5fcm9idXN0X3NpbXNfJXNfJXNfJXNNU18lc19lcnJiYXJzLnBkZiIsIHlfbW9kZWwsIHhfbW9kZWwsIG1lYW5fc2hpZnQsIG1ldHJpYykpLAogICAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgICApCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoKCiMgQ29ycmVsYXRpb24gQmlhcyBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgojIyBNYWluIEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICIjMjE4YTFlIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiNjYzMzOTkiKQpzaG93X21ldGhvZHMgPC0gYygiR01ESSIsICJNREktb29iIiwgIk1EQSIsICJNREkiLCAgIlRyZWVTSEFQIikKbWV0aG9kX2xhYmVscyA8LSBjKCJNREkrIChyaWRnZSkiLCAiTURJLW9vYiIsICJNREEiLCAiTURJIiwgIlRyZWVTSEFQIikKCmN1c3RvbV9jb2xvcl9wYWxldHRlIDwtIGMoIiMzODc2MWQiLCAiIzlkYzg5YiIsICIjOTkxNTAwIikKa2VlcF9oZXJpdGFiaWxpdGllcyA8LSBjKDAuMSwgMC40KQpzaW1fbmFtZSA8LSAibWRpX3BsdXMubWRpX2JpYXNfc2ltcy5jb3JyZWxhdGlvbl9zaW1zLm5vcm1hbF9ibG9ja19jb3JfcGFydGlhbF9saW5lYXJfbHNzX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfcmhvIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMpCgpuIDwtIDI1MApwIDwtIDEwMApzaWdfaWRzIDwtIDA6NQpjbnNpZ19pZHMgPC0gNjo0OQpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCiMjIyMgRXhhbWluZSBhdmVyYWdlIHJhbmsgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJyaG9fbmFtZSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgc2lnX2lkcyA9IHNpZ19pZHMsCiAgY25zaWdfaWRzID0gY25zaWdfaWRzLAogIHBsb3RfdHlwZXMgPSAiZXJyYmFyIiwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgY2F0KHNwcmludGYoIlxuXG4jIyMgUFZFID0gJXNcblxuIiwgaCkpCiAgcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbaWR4XV0kZGF0YQogIHBsdF9scyA8LSBsaXN0KCkKICBmb3IgKG1ldGhvZCBpbiBtZXRob2RfbGFiZWxzKSB7CiAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihmaSA9PSBtZXRob2QpICU+JQogICAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBncm91cCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSArCiAgICAgIGdncGxvdDI6Omdlb21fcmliYm9uKAogICAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIAogICAgICAgICAgICAgICAgICAgICB5bWluID0gLm1lYW4gLSAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICAgICAgICAgICAgICAgICAgeW1heCA9IC5tZWFuICsgKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBncm91cCksIAogICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhID0gMC4yCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgICAgeSA9ICJBdmVyYWdlIFJhbmsiLCAKICAgICAgICBjb2xvciA9ICJGZWF0dXJlXG5Hcm91cCIsIAogICAgICAgIHRpdGxlID0gbWV0aG9kCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICAgICAgeWxpbSA9IGMobWluKHBsdF9kZiQubWVhbikgLSAzLCBtYXgocGx0X2RmJC5tZWFuKSArIDMpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICAgICkKICAgIGlmIChtZXRob2QgIT0gbWV0aG9kX2xhYmVsc1sxXSkgewogICAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9sc1tbbWV0aG9kXV0gKwogICAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICB9CiAgfQogIAogIHBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCiAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSwgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoImNvcnJlbGF0aW9uX3NpbV9wdmUlc193aWRlLnBkZiIsIGgpKSwKICAgICAgICAgICAgICAgICAgICAjIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjI1ICogbGVuZ3RoKHNob3dfbWV0aG9kcykpCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMyAqIGxlbmd0aChzaG93X21ldGhvZHMpKQogIH0gZWxzZSB7CiAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgcGx0X3dpZGUsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjgsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICAgKQogICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICB9Cn0KCgojIyMjIEV4YW1pbmUgbnVtYmVyIG9mIHNwbGl0cyBhY3Jvc3MgdmFyeWluZyBjb3JyZWxhdGlvbiBsZXZlbHMgIyMjIwpjYXQoIlxuXG4jIyMgTnVtYmVyIG9mIFJGIFNwbGl0cyBcblxuIikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMsCiAgICAgICAgICAgICAgICBmaSA9PSAiTURJX3dpdGhfc3BsaXRzIikKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShyaG9fbmFtZSwgaGVyaXRhYmlsaXR5LCByZXApICU+JQogIGRwbHlyOjpzdW1tYXJpc2Uobl9zcGxpdHMgPSBzdW0oYXZfc3BsaXRzKSkKCnBsdF9kZiA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB0b3RhbF9zcGxpdHMsIGJ5ID0gYygicmhvX25hbWUiLCAiaGVyaXRhYmlsaXR5IiwgInJlcCIpCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgYXZfc3BsaXRzID0gYXZfc3BsaXRzIC8gbl9zcGxpdHMgKiAxMDAsCiAgICBncm91cCA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHZhciAlaW4lIHNpZ19pZHMgfiAiU2lnIiwKICAgICAgdmFyICVpbiUgY25zaWdfaWRzIH4gIkMtTlNpZyIsCiAgICAgIFRSVUUgfiAiTlNpZyIKICAgICkKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBncm91cCA9IGZhY3Rvcihncm91cCwgbGV2ZWxzID0gYygiU2lnIiwgIkMtTlNpZyIsICJOU2lnIikpCiAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkocmhvX25hbWUsIGhlcml0YWJpbGl0eSwgZ3JvdXApICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICAubWVhbiA9IG1lYW4oYXZfc3BsaXRzKSwKICAgIC5zZCA9IHNkKGF2X3NwbGl0cykKICApCgptaW5feSA8LSBtaW4ocGx0X2RmJC5tZWFuKQptYXhfeSA8LSBtYXgocGx0X2RmJC5tZWFuKQoKcGx0X2xzIDwtIGxpc3QoKQpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgcGx0IDwtIHBsdF9kZiAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZ3JvdXApICsKICAgIGdncGxvdDI6Omdlb21fbGluZShzaXplID0gMSkgKwogICAgIyBnZ3Bsb3QyOjpnZW9tX3JpYmJvbigKICAgICMgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCAKICAgICMgICAgICAgICAgICAgICAgeW1pbiA9IC5tZWFuIC0gKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAjICAgICAgICAgICAgICAgIHltYXggPSAubWVhbiArICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgIyAgICAgICAgICAgICAgICBmaWxsID0gZ3JvdXApLCAKICAgICMgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYSA9IDAuMgogICAgIyApICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBTcGxpdHMgaW4gUkYgKCUpIiwKICAgICAgY29sb3IgPSAiRmVhdHVyZVxuR3JvdXAiLCAKICAgICAgdGl0bGUgPSBzcHJpbnRmKCJQVkUgPSAlcyIsIGgpCiAgICApICsKICAgIGdncGxvdDI6OmNvb3JkX2NhcnRlc2lhbih5bGltID0gYyhtaW5feSwgbWF4X3kpKSArCiAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICkgKwogICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICkgKwogICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkKICAgICkKICBpZiAoaWR4ICE9IDEpIHsKICAgIHBsdCA8LSBwbHQgKwogICAgICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgfQogIHBsdF9sc1tbaWR4XV0gPC0gcGx0Cn0KCnBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgZ2dwbG90Mjo6Z2dzYXZlKHBsdF93aWRlICYgZ2dwbG90Mjo6dGhlbWUocGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSksIAogICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImNvcnJlbGF0aW9uX3NpbV9udW1fc3BsaXRzLnBkZiIpLAogICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHRfd2lkZSwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCiMjIEFwcGVuZGl4IEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICJncmF5IikKc2hvd19tZXRob2RzIDwtIGMoIkdNREkiLCAiR01ESV9pbmJhZyIpCm1ldGhvZF9sYWJlbHMgPC0gYygiTURJKyAoTE9PKSIsICJNREkrIChpbi1iYWcpIikKCmN1c3RvbV9jb2xvcl9wYWxldHRlIDwtIGMoIiMzODc2MWQiLCAiIzlkYzg5YiIsICIjOTkxNTAwIikKa2VlcF9oZXJpdGFiaWxpdGllcyA8LSBjKDAuMSwgMC40KQpzaW1fbmFtZSA8LSAibWRpX3BsdXMubWRpX2JpYXNfc2ltcy5jb3JyZWxhdGlvbl9zaW1zLm5vcm1hbF9ibG9ja19jb3JfcGFydGlhbF9saW5lYXJfbHNzX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfcmhvIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMpCgpuIDwtIDI1MApwIDwtIDEwMApzaWdfaWRzIDwtIDA6NQpjbnNpZ19pZHMgPC0gNjo0OQpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCiMjIyMgRXhhbWluZSBhdmVyYWdlIHJhbmsgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJyaG9fbmFtZSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgc2lnX2lkcyA9IHNpZ19pZHMsCiAgY25zaWdfaWRzID0gY25zaWdfaWRzLAogIHBsb3RfdHlwZXMgPSAiZXJyYmFyIiwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgY2F0KHNwcmludGYoIlxuXG4jIyMgUFZFID0gJXNcblxuIiwgaCkpCiAgcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbaWR4XV0kZGF0YQogIHBsdF9scyA8LSBsaXN0KCkKICBmb3IgKG1ldGhvZCBpbiBtZXRob2RfbGFiZWxzKSB7CiAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihmaSA9PSBtZXRob2QpICU+JQogICAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBncm91cCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSArCiAgICAgIGdncGxvdDI6Omdlb21fcmliYm9uKAogICAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIAogICAgICAgICAgICAgICAgICAgICB5bWluID0gLm1lYW4gLSAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICAgICAgICAgICAgICAgICAgeW1heCA9IC5tZWFuICsgKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBncm91cCksIAogICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhID0gMC4yCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgICAgeSA9ICJBdmVyYWdlIFJhbmsiLCAKICAgICAgICBjb2xvciA9ICJGZWF0dXJlXG5Hcm91cCIsIAogICAgICAgIHRpdGxlID0gbWV0aG9kCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICAgICAgeWxpbSA9IGMobWluKHBsdF9kZiQubWVhbikgLSAzLCBtYXgocGx0X2RmJC5tZWFuKSArIDMpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICAgICkKICAgIGlmIChtZXRob2QgIT0gbWV0aG9kX2xhYmVsc1sxXSkgewogICAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9sc1tbbWV0aG9kXV0gKwogICAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICB9CiAgfQogIAogIHBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCiAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSwgCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoImNvcnJlbGF0aW9uX3NpbV9wdmUlc193aWRlX2FwcGVuZGl4LnBkZiIsIGgpKSwKICAgICAgICAgICAgICAgICAgICAjIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjI1ICogbGVuZ3RoKHNob3dfbWV0aG9kcykpCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMzcgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICB9IGVsc2UgewogICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgIHBsdF93aWRlLCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICApCiAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogIH0KfQpgYGAKCgojIEVudHJvcHkgQmlhcyBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgojIyBNYWluIEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIk1ESSsgKHJpZGdlKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIHJlcCgwLjcsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKSkKeV9saW1pdHMgPC0gYygxLCA0LjUpCgptZXRyaWNfbmFtZSA8LSAiQVVST0MiCnNpbV9uYW1lIDwtICJtZGlfcGx1cy5tZGlfYmlhc19zaW1zLmVudHJvcHlfc2ltcy5saW5lYXJfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2hlcml0YWJpbGl0eV9uIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKCiMjIyMgRW50cm9weSBSZWdyZXNzaW9uIEF2ZyBSYW5rICMjIyMKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSA9PSAwLjEpCgpjdXN0b21fZ3JvdXBfZnVuIDwtIGZ1bmN0aW9uKHZhcikgdmFyCgpwbHRfYmFzZSA8LSBwbG90X3BlcnR1cmJhdGlvbl9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBmYWNldF9yb3dzID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICBmYWNldF9jb2xzID0gIm5fbmFtZSIsIAogIGdyb3VwX2Z1biA9IGN1c3RvbV9ncm91cF9mdW4sIAogIHBhcmFtX25hbWUgPSBOVUxMLAogIHBsb3RfdHlwZXMgPSAiZXJyYmFyIiwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpwbHRfZGYgPC0gcGx0X2Jhc2UkYWdnW1sxXV0kZGF0YQpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCnBsdF9yZWdyZXNzaW9uIDwtIHBsdF9kZiAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGZpLCBhbHBoYSA9IGZpKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKHNpemUgPSBsaW5lX3NpemUpICsKICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9ICJTYW1wbGUgU2l6ZSIsCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksCiAgICBjb2xvciA9ICJNZXRob2QiLAogICAgdGl0bGUgPSAiUmVncmVzc2lvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IHlfbGltaXRzKSArCiAgdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgYXhpcy50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICkKCiMjIyMgRW50cm9weSBSZWdyZXNzaW9uICMgU3BsaXRzICMjIyMKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSA9PSAwLjEsIAogICAgICAgICAgICAgICAgZmkgPT0gIk1ESV93aXRoX3NwbGl0cyIpCgpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGhlcml0YWJpbGl0eSwgcmVwKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG5fc3BsaXRzID0gc3VtKGF2X3NwbGl0cykpCgpyZWdyZXNzaW9uX251bV9zcGxpdHNfZGYgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6bGVmdF9qb2luKAogICAgdG90YWxfc3BsaXRzLCBieSA9IGMoIm5fbmFtZSIsICJoZXJpdGFiaWxpdHkiLCAicmVwIikKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBhdl9zcGxpdHMgPSBhdl9zcGxpdHMgLyBuX3NwbGl0cyAqIDEwMAogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KG5fbmFtZSwgaGVyaXRhYmlsaXR5LCB2YXIpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICAubWVhbiA9IG1lYW4oYXZfc3BsaXRzKSwKICAgIC5zZCA9IHNkKGF2X3NwbGl0cykKICApCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gUmVzdWx0cyAjIyMjCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIHJldihjKCJibGFjayIsICIjOUI1REZGIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNRElfcmlkZ2UiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpKQptZXRob2RfbGFiZWxzIDwtIHJldihjKCJNREkrIChyaWRnZSkiLCAiTURJKyAobG9naXN0aWMpIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpKQphbHBoYV92YWx1ZXMgPC0gcmV2KGMoMSwgMSwgcmVwKDAuNywgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMikpKQoKbWV0cmljX25hbWUgPC0gIkFVUk9DIgpzaW1fbmFtZSA8LSAibWRpX3BsdXMubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X2NsYXNzaWZpY2F0aW9uIDwtIHBsdF9kZiAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGZpLCBhbHBoYSA9IGZpKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKHNpemUgPSBsaW5lX3NpemUpICsKICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9ICJTYW1wbGUgU2l6ZSIsIAogICAgeSA9IGV4cHJlc3Npb24oIkF2ZXJhZ2UgUmFuayBvZiAiKlhbMV0pLCAKICAgIGNvbG9yID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uICMgU3BsaXRzICMjIyMKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihmaSA9PSAiTURJX3dpdGhfc3BsaXRzIikKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGMsIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKY2xhc3NpZmljYXRpb25fbnVtX3NwbGl0c19kZiA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB0b3RhbF9zcGxpdHMsIGJ5ID0gYygibl9uYW1lIiwgImMiLCAicmVwIikKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBhdl9zcGxpdHMgPSBhdl9zcGxpdHMgLyBuX3NwbGl0cyAqIDEwMAogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KG5fbmFtZSwgYywgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBTaG93IEF2ZyBSYW5rIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgQXZlcmFnZSBSYW5rIFxuXG4iKQpwbHQgPC0gcGx0X3JlZ3Jlc3Npb24gKyBwbHRfY2xhc3NpZmljYXRpb24KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImVudHJvcHlfc2ltcy5wZGYiKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS4yLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0LCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC44LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKIyMjIyBTaG93ICMgU3BsaXRzIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgTnVtYmVyIG9mIFJGIFNwbGl0cyBcblxuIikKcGx0X2RmIDwtIGRwbHlyOjpiaW5kX3Jvd3MoCiAgUmVncmVzc2lvbiA9IHJlZ3Jlc3Npb25fbnVtX3NwbGl0c19kZiwgCiAgQ2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbl9udW1fc3BsaXRzX2RmLCAKICAuaWQgPSAidHlwZSIKKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgdmFyID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgdmFyID09IDAgfiAiQmVybm91bGxpIChTaWduYWwpIiwKICAgICAgdmFyID09IDEgfiAiTm9ybWFsIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSAyIH4gIjQtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICB2YXIgPT0gMyB+ICIxMC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSA0IH4gIjIwLUNhdGVnb3JpZXMgKE5vbi1TaWduYWwpIgogICAgKSAlPiUKICAgICAgZmFjdG9yKGxldmVscyA9IGMoIk5vcm1hbCAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMjAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMTAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiNC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJCZXJub3VsbGkgKFNpZ25hbCkiKSkKICApCgpzaW1fdHlwZXMgPC0gdW5pcXVlKHBsdF9kZiR0eXBlKQpwbHRfbHMgPC0gbGlzdCgpCmZvciAoaWR4IGluIDE6bGVuZ3RoKHNpbV90eXBlcykpIHsKICBzaW1fdHlwZSA8LSBzaW1fdHlwZXNbaWR4XQogIHBsdCA8LSBwbHRfZGYgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHR5cGUgPT0gISFzaW1fdHlwZSkgJT4lCiAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGFzLmZhY3Rvcih2YXIpKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICAgIHggPSAiU2FtcGxlIFNpemUiLAogICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgU3BsaXRzIGluIFJGICglKSIsCiAgICAgIGNvbG9yID0gIkZlYXR1cmUiLCAKICAgICAgdGl0bGUgPSBzaW1fdHlwZQogICAgKSArCiAgICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgbGluZXR5cGUgPSAibm9uZSIpICsKICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICAgKQogIGlmIChpZHggIT0gMSkgewogICAgcGx0IDwtIHBsdCArCiAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICB9CiAgcGx0X2xzW1tpZHhdXSA8LSBwbHQKfQoKcGx0X3dpZGUgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBucm93ID0gMSkKaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0X3dpZGUsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiZW50cm9weV9zaW1zX251bV9zcGxpdHMucGRmIiksCiAgICAgICAgICAgICAgICAgICMgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMjUgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHRfd2lkZSwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCiMjIEFwcGVuZGl4IEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgImJsYWNrIiwgIiM3MWJlYjciKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJIiwgIkdNRElfaW5iYWciLCAiTURJIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIk1ESSsgKHJpZGdlLCBMT08pIiwgIk1ESSsgKHJpZGdlLCBpbi1iYWcpIiwgIk1ESSIpKQphbHBoYV92YWx1ZXMgPC0gcmV2KGMoMSwgMSwgcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKbGluZXR5cGVfdmFsdWVzIDwtIGMoInNvbGlkIiwgImRhc2hlZCIsICJzb2xpZCIpCnlfbGltaXRzIDwtIGMoMSwgNSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gIm1kaV9wbHVzLm1kaV9iaWFzX3NpbXMuZW50cm9weV9zaW1zLmxpbmVhcl9kZ3AiCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgc2ltX25hbWUsCiAgInZhcnlpbmdfaGVyaXRhYmlsaXR5X24iLAogIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICJyZXN1bHRzLmNzdiIKKQoKIyMjIyBFbnRyb3B5IFJlZ3Jlc3Npb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eV9uYW1lID09IDAuMSkKCmN1c3RvbV9ncm91cF9mdW4gPC0gZnVuY3Rpb24odmFyKSB2YXIKCnBsdF9iYXNlIDwtIHBsb3RfcGVydHVyYmF0aW9uX3N0YWJpbGl0eSgKICByZXN1bHRzLAogIGZhY2V0X3Jvd3MgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X3JlZ3Jlc3Npb24gPC0gcGx0X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMCkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbl9uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZmksIGFscGhhID0gZmksIGxpbmV0eXBlID0gZmkpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSkgKwogIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIlNhbXBsZSBTaXplIiwgCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksIAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIGxpbmV0eXBlID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJSZWdyZXNzaW9uIgogICkgKwogIGdncGxvdDI6Omd1aWRlcyhmaWxsID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGFscGhhX3ZhbHVlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBsaW5ldHlwZV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IHlfbGltaXRzKSArCiAgdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgYXhpcy50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwKICAgIGxlZ2VuZC5rZXkud2lkdGggPSBnZ3Bsb3QyOjp1bml0KDEsICJjbSIpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uIFJlc3VsdHMgIyMjIwptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSByZXYoYygiYmxhY2siLCAiYmxhY2siLCAiIzlCNURGRiIsICIjOUI1REZGIiwgIiM3MWJlYjciKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJX3JpZGdlIiwgIkdNRElfcmlkZ2VfaW5iYWciLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zc19pbmJhZyIsICJNREkiKSkKbWV0aG9kX2xhYmVscyA8LSByZXYoYygiTURJKyAocmlkZ2UsIExPTykiLCAiTURJKyAocmlkZ2UsIGluLWJhZykiLCAiTURJKyAobG9naXN0aWMsIExPTykiLCAiTURJKyAobG9naXN0aWMsIGluLWJhZykiLCAiTURJIikpCmFscGhhX3ZhbHVlcyA8LSByZXYoYygxLCAxLCAxLCAxLCByZXAoMSwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gNCkpKQpsaW5ldHlwZV92YWx1ZXMgPC0gYygic29saWQiLCAiZGFzaGVkIiwgInNvbGlkIiwgImRhc2hlZCIsICJzb2xpZCIpCgptZXRyaWNfbmFtZSA8LSAiQVVST0MiCnNpbV9uYW1lIDwtICJtZGlfcGx1cy5tZGlfYmlhc19zaW1zLmVudHJvcHlfc2ltcy5sb2dpc3RpY19kZ3AiCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgc2ltX25hbWUsCiAgInZhcnlpbmdfY19uIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKCiMjIyMgRW50cm9weSBDbGFzc2lmaWNhdGlvbiBBdmcgUmFuayAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpCgpjdXN0b21fZ3JvdXBfZnVuIDwtIGZ1bmN0aW9uKHZhcikgdmFyCgpwbHRfYmFzZSA8LSBwbG90X3BlcnR1cmJhdGlvbl9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBmYWNldF9yb3dzID0gImNfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJuX25hbWUiLCAKICBncm91cF9mdW4gPSBjdXN0b21fZ3JvdXBfZnVuLCAKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfY2xhc3NpZmljYXRpb24gPC0gcGx0X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMCkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbl9uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZmksIGFscGhhID0gZmksIGxpbmV0eXBlID0gZmkpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSkgKwogIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIlNhbXBsZSBTaXplIiwgCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksIAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIGxpbmV0eXBlID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gbGluZXR5cGVfdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMSwgImNtIikKICApCgojIyMjIFNob3cgQXZnIFJhbmsgUGxvdCAjIyMjCmNhdCgiXG5cbiMjIyBBdmVyYWdlIFJhbmsgXG5cbiIpCnBsdCA8LSBwbHRfcmVncmVzc2lvbiArIHBsdF9jbGFzc2lmaWNhdGlvbgppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGdncGxvdDI6Omdnc2F2ZShwbHQsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiZW50cm9weV9zaW1zX2FwcGVuZGl4LnBkZiIpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjM1LCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0LCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC43LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKYGBgCgoKIyBDQ0xFIENhc2UgU3R1ZHkgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjMjE4YTFlIiwgIiNjYzMzOTkiKQpzaG93X21ldGhvZHMgPC0gYygiTURJKyIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQptZXRob2RfbGFiZWxzIDwtIGMoIk1ESSsgKHJpZGdlKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQphbHBoYV92YWx1ZXMgPC0gYygxLCByZXAoMC40LCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSAxKSkKCmZwYXRoIDwtICJtZGlfcGx1cy5yZWFsX2RhdGFfY2FzZV9zdHVkeS5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLSIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBmcGF0aCwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKcHJlZF9mbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIGZwYXRoLAogIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICJwcmVkX3Jlc3VsdHMuY3N2IgopClggPC0gZGF0YS50YWJsZTo6ZnJlYWQoIi9nbG9iYWwvc2NyYXRjaC91c2Vycy90aWZmYW55dGFuZy9mZWF0dXJlX2ltcG9ydGFuY2UvZGF0YS9YX2NjbGVfcm5hc2VxX2NsZWFuZWRfZmlsdGVyZWQ1MDAwLmNzdiIpClhfY29sdW1ucyA8LSBjb2xuYW1lcyhYKQpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQpwcmVkX3Jlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQocHJlZF9mbmFtZSkgJT4lCiAgdGliYmxlOjphc190aWJibGUoKSAlPiUKICBkcGx5cjo6bXV0YXRlKG1ldGhvZCA9IGZpKSAlPiUKICAjIHRpZHlyOjp1bml0ZShjb2wgPSAibWV0aG9kIiwgZmksIG1vZGVsLCBuYS5ybSA9IFRSVUUsIHJlbW92ZSA9IEZBTFNFKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IG1ldHJpYywgdmFsdWVzX2Zyb20gPSBtZXRyaWNfdmFsdWUpCgpvdXQgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZ3JvdXBfaWQgPSAieV90YXNrIiwKICB0b3BfciA9IDEwLAogIHNob3dfbWF4X2ZlYXR1cmVzID0gNSwKICB2YXJuYW1lcyA9IGNvbG5hbWVzKFgpLAogIGJhc2VfbWV0aG9kID0gIk1ESSsgKHJpZGdlKSIsCiAgcmV0dXJuX2RmID0gVFJVRSwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IHJldihtYW51YWxfY29sb3JfcGFsZXR0ZSksCiAgc2hvd19tZXRob2RzID0gcmV2KHNob3dfbWV0aG9kcyksCiAgbWV0aG9kX2xhYmVscyA9IHJldihtZXRob2RfbGFiZWxzKQopCgpyYW5raW5nX2RmIDwtIG91dCRyYW5raW5ncwpzdGFiaWxpdHlfZGYgPC0gb3V0JHN0YWJpbGl0eQpwbHRfbHMgPC0gb3V0JHBsb3RfbHMKCiMgZ2V0IGdlbmUgbmFtZXMgaW5zdGVhZCBvZiBFTlNHIGlkcwpsaWJyYXJ5KEVuc0RiLkhzYXBpZW5zLnY3OSkKdmFybmFtZXMgPC0gZW5zZW1ibGRiOjpzZWxlY3QoCiAgRW5zRGIuSHNhcGllbnMudjc5LCAKICBrZXlzID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIiksIAogIGtleXR5cGUgPSAiR0VORUlEIiwgY29sdW1ucyA9IGMoIkdFTkVJRCIsIlNZTUJPTCIpCikKCiMgZ2V0IHRvcCA1IGdlbmVzCnRvcF9nZW5lcyA8LSByYW5raW5nX2RmICU+JQogIGRwbHlyOjpncm91cF9ieSh5X3Rhc2ssIGZpLCB2YXIpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobWVhbl9yYW5rID0gbWVhbihyYW5rKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6YXJyYW5nZSh5X3Rhc2ssIG1lYW5fcmFuaykgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHlfdGFzaywgZmkpICU+JQogIGRwbHlyOjptdXRhdGUocmFuayA9IDE6ZHBseXI6Om4oKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKQoKdG9wX2dlbmVzX3RhYmxlIDwtIHRvcF9nZW5lcyAlPiUKICBkcGx5cjo6ZmlsdGVyKHJhbmsgPD0gNTApICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB5ID0gZGF0YS5mcmFtZSh2YXIgPSAwOihuY29sKFgpIC0gMSksIAogICAgICAgICAgICAgICAgICAgR0VORUlEID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIikpLAogICAgYnkgPSAidmFyIgogICkgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHkgPSB2YXJuYW1lcywgYnkgPSAiR0VORUlEIgogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIHZhbHVlID0gc3ByaW50ZigiJXMgKCVzKSIsIFNZTUJPTCwgcm91bmQobWVhbl9yYW5rLCAyKSkKICApICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcigKICAgIGlkX2NvbHMgPSBjKHlfdGFzaywgcmFuayksIAogICAgbmFtZXNfZnJvbSA9IGZpLCAKICAgIHZhbHVlc19mcm9tID0gdmFsdWUKICApICU+JQogIGRwbHlyOjpyZW5hbWUoCiAgICAiRHJ1ZyIgPSAieV90YXNrIiwKICAgICJSYW5rIiA9ICJyYW5rIgogICkKCiMgd3JpdGUuY3N2KAojICAgdG9wX2dlbmVzX3RhYmxlLCBmaWxlLnBhdGgodGFibGVzX2RpciwgImNjbGVfcm5hc2VxX3RvcF9nZW5lc190YWJsZS5jc3YiKSwKIyAgIHJvdy5uYW1lcyA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFCiMgKQoKIyBnZXQgIyBnZW5lcyB3aXRoIHBlcmZlY3Qgc3RhYmlsaXR5CnN0YWJsZV9nZW5lc19rYWJsZSA8LSBzdGFiaWxpdHlfZGYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpLCB5X3Rhc2spICU+JQogIGRwbHlyOjpzdW1tYXJpc2Uoc3RhYmlsaXR5XzEgPSBzdW0oc3RhYmlsaXR5X3Njb3JlID09IDEpKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scyA9IGZpLCBuYW1lc19mcm9tID0geV90YXNrLCB2YWx1ZXNfZnJvbSA9IHN0YWJpbGl0eV8xKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGFzLmRhdGEuZnJhbWUoKQoKcHJlZF9wbHRfbHMgPC0gbGlzdCgpCmZvciAocGx0X2lkIGluIG5hbWVzKHBsdF9scykpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIFxuXG4iLCBwbHRfaWQpKQogIHBsdCA8LSBwbHRfbHNbW3BsdF9pZF1dCiAgaWYgKHBsdF9pZCA9PSAiU3VtbWFyeSIpIHsKICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpsYWJzKHkgPSAiRHJ1ZyIpCiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImNjbGVfcm5hc2VxX3N0YWJpbGl0eV90b3AxMC5wZGYiKSwgCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEuNSwgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIDEuMSkKICAgIH0gZWxzZSB7CiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgICAgIHBsdCwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIHBsdF9pZCksIAogICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICAgKQogICAgfQogICAgCiAgICBjYXQoIlxuXG4jIyBUYWJsZSBvZiBUb3AgR2VuZXMgXG5cbiIpCiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICB0b3BfZ2VuZXNfa2FibGUgPC0gdG9wX2dlbmVzX3RhYmxlICU+JQogICAgICAgIGRwbHlyOjpmaWx0ZXIoUmFuayA8PSA1KSAlPiUKICAgICAgICBkcGx5cjo6c2VsZWN0KC1EcnVnKSAlPiUKICAgICAgICBkcGx5cjo6cmVuYW1lKCIgIiA9ICJSYW5rIikgJT4lCiAgICAgICAgdnRoZW1lczo6cHJldHR5X2thYmxlKGZvcm1hdCA9ICJsYXRleCIsIGxvbmd0YWJsZSA9IFRSVUUpICU+JQogICAgICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9ICJyZXBlYXRfaGVhZGVyIikgJT4lCiAgICAgICAgIyBrYWJsZUV4dHJhOjpjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxLCB2YWxpZ24gPSAibWlkZGxlIikKICAgICAgICBrYWJsZUV4dHJhOjpwYWNrX3Jvd3MoCiAgICAgICAgICBpbmRleCA9IHJlcCg1LCAyNCkgJT4lIHNldE5hbWVzKHVuaXF1ZSh0b3BfZ2VuZXNfdGFibGUkRHJ1ZykpCiAgICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgdG9wX2dlbmVzX2thYmxlIDwtIHRvcF9nZW5lc190YWJsZSAlPiUKICAgICAgICBkcGx5cjo6ZmlsdGVyKFJhbmsgPD0gNSkgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdCgtRHJ1ZykgJT4lCiAgICAgICAgZHBseXI6OnJlbmFtZSgiICIgPSAiUmFuayIpICU+JQogICAgICAgIHZ0aGVtZXM6OnByZXR0eV9rYWJsZSgpICU+JQogICAgICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9ICJyZXBlYXRfaGVhZGVyIikgJT4lCiAgICAgICAgIyBrYWJsZUV4dHJhOjpjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxLCB2YWxpZ24gPSAibWlkZGxlIikKICAgICAgICBrYWJsZUV4dHJhOjpwYWNrX3Jvd3MoCiAgICAgICAgICBpbmRleCA9IHJlcCg1LCAyNCkgJT4lIHNldE5hbWVzKHVuaXF1ZSh0b3BfZ2VuZXNfdGFibGUkRHJ1ZykpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgICB0b3BfZ2VuZXNfa2FibGUsIGkgPSBzcHJpbnRmKCIlcy10YWJsZSIsIGZwYXRoKQogICAgICApCiAgICB9CiAgfSBlbHNlIHsKICAgIHByZWRfcGx0X2xzW1twbHRfaWRdXSA8LSBwcmVkX3Jlc3VsdHMgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIoayA8PSAxMCwgeV90YXNrID09ICEhcGx0X2lkKSAlPiUKICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgIG1ldHJpYyA9ICJyMiIsCiAgICAgICAgeF9zdHIgPSAiayIsCiAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICBpbnNpZGVfbGVnZW5kID0gRkFMU0UKICAgICAgKSArCiAgICAgIGdncGxvdDI6OmxhYnMoeCA9ICJOdW1iZXIgb2YgVG9wIEZlYXR1cmVzIChrKSIsIHkgPSAiVGVzdCBSLXNxdWFyZWQiLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsIHRpdGxlID0gcGx0X2lkKSArCiAgICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oKQogICAgCiAgICBpZiAoIXBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgICAgcGxvdF9mdW4ocGx0KSwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIHBsdF9pZCksIAogICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgICBwbG90X2Z1bihwcmVkX3BsdF9sc1tbcGx0X2lkXV0pLCBpID0gc3ByaW50ZigiJXMtJXMtcHJlZCIsIGZwYXRoLCBwbHRfaWQpLCAKICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICAgICkKICAgIH0KICB9Cn0KCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgYWxsX3BsdF9scyA8LSBsaXN0KCkKICBmb3IgKGlkeCBpbiAxOmxlbmd0aChwcmVkX3BsdF9scykpIHsKICAgIGRydWcgPC0gbmFtZXMocHJlZF9wbHRfbHMpW2lkeF0KICAgIHBsdCA8LSBwcmVkX3BsdF9sc1tbZHJ1Z11dCiAgICBpZiAoKGlkeCAtIDEpICUlIDQgIT0gMCkgewogICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgfQogICAgaWYgKChpZHggLSAxKSAlLyUgNCAhPSA1KSB7CiAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICB9CiAgICBhbGxfcGx0X2xzW1tkcnVnXV0gPC0gcGx0CiAgfQogIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMoYWxsX3BsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBuY29sID0gNCwgbnJvdyA9IDYpICYKICAgIGdncGxvdDI6OnRoZW1lKAogICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGdncGxvdDI6OmVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksCiAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoY29sb3IgPSAid2hpdGUiKQogICAgKQogIGdncGxvdDI6Omdnc2F2ZShwbHQsIAogICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImNjbGVfcm5hc2VxX3ByZWRpY3Rpb25zLnBkZiIpLAogICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAyKQogIAogIHByZWQxMF9yYW5rcyA8LSBwcmVkX3Jlc3VsdHMgJT4lIAogICAgZHBseXI6OmZpbHRlcihrID09IDEwKSAlPiUgCiAgICBkcGx5cjo6Z3JvdXBfYnkoZmksIHlfdGFzaykgJT4lIAogICAgZHBseXI6OnN1bW1hcmlzZShyMiA9IG1lYW4ocjIpKSAlPiUgCiAgICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHlfdGFzaywgdmFsdWVzX2Zyb20gPSByMikgJT4lIAogICAgZHBseXI6OnVuZ3JvdXAoKSAlPiUgCiAgICBkcGx5cjo6bXV0YXRlKGRwbHlyOjphY3Jvc3MoYDE3LUFBR2A6YFpELTY0NzRgLCB+cmFuaygtLngpKSkKICBwcmVkMTBfcmFua3NfdGFibGUgPC0gYXBwbHkocHJlZDEwX3JhbmtzLCAxLCBGVU4gPSBmdW5jdGlvbih4KSB0YWJsZSh4Wy0xXSkpICU+JQogICAgdGliYmxlOjphc190aWJibGUoKSAlPiUKICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJSYW5rIikgJT4lCiAgICBzZXROYW1lcyhjKCJSYW5rIiwgcHJlZDEwX3JhbmtzJGZpKSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KFJhbmssIGBNREkrYCwgVHJlZVNIQVAsIE1ESSwgYE1ESS1vb2JgLCBNREEpICU+JQogICAgdnRoZW1lczo6cHJldHR5X2thYmxlKGZvcm1hdCA9ICJsYXRleCIpCiAgdG9wX2dlbmVzX2thYmxlIDwtIHRvcF9nZW5lc190YWJsZSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoUmFuayA8PSA1KSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoLURydWcpICU+JQogICAgZHBseXI6OnJlbmFtZSgiICIgPSAiUmFuayIpICU+JQogICAgdnRoZW1lczo6cHJldHR5X2thYmxlKCkgJT4lCiAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpICU+JQogICAgIyBrYWJsZUV4dHJhOjpjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxLCB2YWxpZ24gPSAibWlkZGxlIikKICAgIGthYmxlRXh0cmE6OnBhY2tfcm93cygKICAgICAgaW5kZXggPSByZXAoNSwgMjQpICU+JSBzZXROYW1lcyh1bmlxdWUodG9wX2dlbmVzX3RhYmxlJERydWcpKQogICAgKQogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgdG9wX2dlbmVzX2thYmxlLCBpID0gc3ByaW50ZigiJXMtdGFibGUiLCBmcGF0aCkKICApCn0KYGBgCgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBtYW51YWxfY29sb3JfcGFsZXR0ZV9mdWxsIDwtIGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpCiAgc2hvd19tZXRob2RzX2Z1bGwgPC0gYygiTURJKyIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQogIG1ldGhvZF9sYWJlbHNfZnVsbCA8LSBjKCJNREkrIChyaWRnZSkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikKICBrZWVwX21ldGhvZHNfbGlzdCA8LSBsaXN0KAogICAgYWxsID0gc2hvd19tZXRob2RzX2Z1bGwsCiAgICBub19tZGlvb2IgPSBjKCJNREkrIiwgIk1EQSIsICJNREkiLCAiVHJlZVNIQVAiKSwKICAgIHpvb20gPSBjKCJNREkrIiwgIk1ESSIsICJUcmVlU0hBUCIpCiAgKQogIAogIGZwYXRoIDwtICJtZGlfcGx1cy5yZWFsX2RhdGFfY2FzZV9zdHVkeS5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLSIKICBmbmFtZSA8LSBmaWxlLnBhdGgoCiAgICByZXN1bHRzX2RpciwgCiAgICBmcGF0aCwKICAgIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICAgInJlc3VsdHMuY3N2IgogICkKICBYIDwtIGRhdGEudGFibGU6OmZyZWFkKCIvZ2xvYmFsL3NjcmF0Y2gvdXNlcnMvdGlmZmFueXRhbmcvZmVhdHVyZV9pbXBvcnRhbmNlL2RhdGEvWF9jY2xlX3JuYXNlcV9jbGVhbmVkX2ZpbHRlcmVkNTAwMC5jc3YiKQogIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpCiAgCiAgZm9yIChpZCBpbiBuYW1lcyhrZWVwX21ldGhvZHNfbGlzdCkpIHsKICAgIGtlZXBfbWV0aG9kcyA8LSBrZWVwX21ldGhvZHNfbGlzdFtbaWRdXQogICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gbWFudWFsX2NvbG9yX3BhbGV0dGVfZnVsbFtzaG93X21ldGhvZHNfZnVsbCAlaW4lIGtlZXBfbWV0aG9kc10KICAgIHNob3dfbWV0aG9kcyA8LSBzaG93X21ldGhvZHNfZnVsbFtzaG93X21ldGhvZHNfZnVsbCAlaW4lIGtlZXBfbWV0aG9kc10KICAgIG1ldGhvZF9sYWJlbHMgPC0gbWV0aG9kX2xhYmVsc19mdWxsW3Nob3dfbWV0aG9kc19mdWxsICVpbiUga2VlcF9tZXRob2RzXQogICAgCiAgICBwbHRfbHMgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogICAgICByZXN1bHRzLAogICAgICBncm91cF9pZCA9ICJ5X3Rhc2siLAogICAgICB0b3BfciA9IDEwLAogICAgICBzaG93X21heF9mZWF0dXJlcyA9IDUsCiAgICAgIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgICAgIGJhc2VfbWV0aG9kID0gIk1ESSsiLAogICAgICByZXR1cm5fZGYgPSBGQUxTRSwKICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwogICAgKQogICAgYWxsX3BsdF9scyA8LSBsaXN0KCkKICAgIGZvciAoaWR4IGluIDE6bGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHlfdGFzaykpKSB7CiAgICAgIGRydWcgPC0gc29ydCh1bmlxdWUocmVzdWx0cyR5X3Rhc2spKVtpZHhdCiAgICAgIHBsdCA8LSBwbHRfbHNbW2RydWddXQogICAgICBpZiAoKGlkeCAtIDEpICUlIDQgIT0gMCkgewogICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgIH0KICAgICAgaWYgKChpZHggLSAxKSAlLyUgNCAhPSA1KSB7CiAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgfQogICAgICBhbGxfcGx0X2xzW1tkcnVnXV0gPC0gcGx0CiAgICB9CiAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKGFsbF9wbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbmNvbCA9IDQsIG5yb3cgPSA2KSAmCiAgICAgIGdncGxvdDI6OnRoZW1lKAogICAgICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBnZ3Bsb3QyOjplbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTk1Iiwgc2l6ZSA9IGdncGxvdDI6OnJlbCgwLjI1KSkKICAgICAgKQogICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoImNjbGVfcm5hc2VxX3N0YWJpbGl0eV9zZWxlY3RfZmVhdHVyZXNfJXMucGRmIiwgaWQpKSwKICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAyKQogIH0KfQpgYGAKCgojIFRDR0EgQlJDQSBDYXNlIFN0dWR5IHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiYmxhY2siLCAiIzlCNURGRiIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjY2MzMzk5IikKc2hvd19tZXRob2RzIDwtIGMoIk1ESStfcmlkZ2UiLCAiTURJK19sb2dpc3RpY19sb2dsb3NzIiwgIk1EQSIsICJNREkiLCAiVHJlZVNIQVAiKQptZXRob2RfbGFiZWxzIDwtIGMoIk1ESSsgKHJpZGdlKSIsICJNREkrIChsb2dpc3RpYykiLCAiTURBIiwgIk1ESSIsICJUcmVlU0hBUCIpCmFscGhhX3ZhbHVlcyA8LSBjKDEsIDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKQoKZnBhdGggPC0gIm1kaV9wbHVzLnJlYWxfZGF0YV9jYXNlX3N0dWR5LnRjZ2FfYnJjYV9jbGFzc2lmaWNhdGlvbi0iCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgZnBhdGgsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopClggPC0gZGF0YS50YWJsZTo6ZnJlYWQoIi9nbG9iYWwvc2NyYXRjaC91c2Vycy90aWZmYW55dGFuZy9mZWF0dXJlX2ltcG9ydGFuY2UvZGF0YS9YX3RjZ2FfY2xlYW5lZC5jc3YiKQpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQpvdXQgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZ3JvdXBfaWQgPSBOVUxMLAogIHRvcF9yID0gMTAsCiAgc2hvd19tYXhfZmVhdHVyZXMgPSAyMCwKICB2YXJuYW1lcyA9IGNvbG5hbWVzKFgpLAogIGJhc2VfbWV0aG9kID0gIk1ESSsgKHJpZGdlKSIsIAogICMgZGVzY2VuZGluZ19tZXRob2RzID0gIk1ESSsgKGxvZ2lzdGljKSIsCiAgcmV0dXJuX2RmID0gVFJVRSwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpyYW5raW5nX2RmIDwtIG91dCRyYW5raW5ncwpzdGFiaWxpdHlfZGYgPC0gb3V0JHN0YWJpbGl0eQpwbHRfbHMgPC0gb3V0JHBsb3RfbHMKCmNhdCgiXG5cbiMjIE5vbi16ZXJvIFN0YWJpbGl0eSBTY29yZXMgUGVyIE1ldGhvZFxuXG4iKQp2dGhlbWVzOjpzdWJjaHVua2lmeSgKICBwbHRfbHNbWzFdXSwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIDEpLCAKICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIHJvdW5kKGxlbmd0aCh1bmlxdWUocmVzdWx0cyRmaSkpIC8gMiksIGZpZ193aWR0aCA9IGZpZ193aWR0aAopCgpjYXQoIlxuXG4jIyBTdGFiaWxpdHkgb2YgVG9wIEZlYXR1cmVzXG5cbiIpCnZ0aGVtZXM6OnN1YmNodW5raWZ5KAogIHBsb3RfZnVuKHBsdF9sc1tbMl1dKSwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIDIpLCAKICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoCikKCiMgZ2V0IHRvcCAyNSBnZW5lcwp0b3BfZ2VuZXMgPC0gcmFua2luZ19kZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoZmksIHZhcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuX3JhbmsgPSBtZWFuKHJhbmspKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjphcnJhbmdlKG1lYW5fcmFuaykgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHJhbmsgPSAxOmRwbHlyOjpuKCkpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkKCnRvcF9nZW5lc190YWJsZSA8LSB0b3BfZ2VuZXMgJT4lCiAgZHBseXI6OmZpbHRlcihyYW5rIDw9IDI1KSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKAogICAgeSA9IGRhdGEuZnJhbWUodmFyID0gMDoobmNvbChYKSAtIDEpLCAKICAgICAgICAgICAgICAgICAgIGdlbmUgPSBjb2xuYW1lcyhYKSksCiAgICBieSA9ICJ2YXIiCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgdmFsdWUgPSBzcHJpbnRmKCIlcyAoJXMpIiwgZ2VuZSwgcm91bmQobWVhbl9yYW5rLCAyKSkKICApICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcigKICAgIGlkX2NvbHMgPSByYW5rLCAKICAgIG5hbWVzX2Zyb20gPSBmaSwgCiAgICB2YWx1ZXNfZnJvbSA9IHZhbHVlCiAgKSAlPiUKICBkcGx5cjo6cmVuYW1lKAogICAgIlJhbmsiID0gInJhbmsiCiAgKQoKIyB3cml0ZS5jc3YoCiMgICB0b3BfZ2VuZXNfdGFibGUsIGZpbGUucGF0aCh0YWJsZXNfZGlyLCAidGNnYV90b3BfZ2VuZXNfdGFibGUuY3N2IiksCiMgICByb3cubmFtZXMgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRQojICkKCnN0YWJsZV9nZW5lc19rYWJsZSA8LSBzdGFiaWxpdHlfZGYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKHN0YWJpbGl0eV8xID0gc3VtKHN0YWJpbGl0eV9zY29yZSA9PSAxKSkgJT4lCiAgdGliYmxlOjphc190aWJibGUoKQoKY2F0KCJcblxuIyMgVGFibGUgb2YgVG9wIEdlbmVzIFxuXG4iKQppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIHRvcF9nZW5lc19rYWJsZSA8LSB0b3BfZ2VuZXNfdGFibGUgJT4lCiAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoZm9ybWF0ID0gImxhdGV4IikjLCBsb25ndGFibGUgPSBUUlVFKSAlPiUKICAgICMga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhsYXRleF9vcHRpb25zID0gInJlcGVhdF9oZWFkZXIiKQp9IGVsc2UgewogIHRvcF9nZW5lc19rYWJsZSA8LSB0b3BfZ2VuZXNfdGFibGUgJT4lCiAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoKSAlPiUKICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9ICJyZXBlYXRfaGVhZGVyIikKICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgIHRvcF9nZW5lc19rYWJsZSwgaSA9IHNwcmludGYoIiVzLXRhYmxlIiwgZnBhdGgpCiAgKQp9CgpjYXQoIlxuXG4jIyBQcmVkaWN0aW9uIHVzaW5nIFRvcCBGZWF0dXJlc1xuXG4iKQpwcmVkX2ZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgZnBhdGgsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInByZWRfcmVzdWx0cy5jc3YiCikKcHJlZF9yZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHByZWRfZm5hbWUpICU+JQogIHRpYmJsZTo6YXNfdGliYmxlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShtZXRob2QgPSBmaSkgJT4lCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBtZXRyaWMsIHZhbHVlc19mcm9tID0gbWV0cmljX3ZhbHVlKQpwbHQgPC0gcHJlZF9yZXN1bHRzICU+JQogIGRwbHlyOjpmaWx0ZXIoayA8PSAyNSkgJT4lCiAgcGxvdF9tZXRyaWNzKAogICAgbWV0cmljID0gYygicm9jYXVjIiwgImFjY3VyYWN5IiksCiAgICB4X3N0ciA9ICJrIiwKICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgIGluc2lkZV9sZWdlbmQgPSBGQUxTRQogICkgKwogIGdncGxvdDI6OmxhYnMoeCA9ICJOdW1iZXIgb2YgVG9wIEZlYXR1cmVzIChrKSIsIHkgPSAiTWVhbiBQcmVkaWN0aW9uIFBlcmZvcm1hbmNlIiwgCiAgICAgICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiKQppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGdncGxvdDI6Omdnc2F2ZShwbHQsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAidGNnYV9icmNhX3ByZWRpY3Rpb24ucGRmIiksCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS4zLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjg1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGxvdF9mdW4ocGx0KSwgaSA9IHNwcmludGYoIiVzLXByZWQiLCBmcGF0aCksIAogICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQgKiAuOCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS41CiAgKQp9CmBgYAoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiYmxhY2siLCAiIzlCNURGRiIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjMjE4YTFlIiwgIiNjYzMzOTkiKQogIHNob3dfbWV0aG9kcyA8LSBjKCJNREkrX3JpZGdlIiwgIk1ESStfbG9naXN0aWNfbG9nbG9zcyIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQogIG1ldGhvZF9sYWJlbHMgPC0gYygiTURJKyAocmlkZ2UpIiwgIk1ESSsgKGxvZ2lzdGljKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQogIAogICMgY2NsZSBybmFzZXEKICBmcGF0aCA8LSAibWRpX3BsdXMucmVhbF9kYXRhX2Nhc2Vfc3R1ZHkuY2NsZV9ybmFzZXFfcmVncmVzc2lvbi0iCiAgZm5hbWUgPC0gZmlsZS5wYXRoKAogICAgcmVzdWx0c19kaXIsIAogICAgZnBhdGgsCiAgICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAgICJyZXN1bHRzLmNzdiIKICApCiAgWF9jY2xlIDwtIGRhdGEudGFibGU6OmZyZWFkKCIvZ2xvYmFsL3NjcmF0Y2gvdXNlcnMvdGlmZmFueXRhbmcvZmVhdHVyZV9pbXBvcnRhbmNlL2RhdGEvWF9jY2xlX3JuYXNlcV9jbGVhbmVkX2ZpbHRlcmVkNTAwMC5jc3YiKQogIHJlc3VsdHNfY2NsZSA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKAogICAgICBmaSA9IGlmZWxzZShmaSA9PSAiTURJKyIsICJNREkrX3JpZGdlIiwgZmkpCiAgICApCiAgCiAgIyB0Y2dhCiAgZnBhdGggPC0gIm1kaV9wbHVzLnJlYWxfZGF0YV9jYXNlX3N0dWR5LnRjZ2FfYnJjYV9jbGFzc2lmaWNhdGlvbi0iCiAgZm5hbWUgPC0gZmlsZS5wYXRoKAogICAgcmVzdWx0c19kaXIsIAogICAgZnBhdGgsCiAgICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAgICJyZXN1bHRzLmNzdiIKICApCiAgWF90Y2dhIDwtIGRhdGEudGFibGU6OmZyZWFkKCIvZ2xvYmFsL3NjcmF0Y2gvdXNlcnMvdGlmZmFueXRhbmcvZmVhdHVyZV9pbXBvcnRhbmNlL2RhdGEvWF90Y2dhX2NsZWFuZWQuY3N2IikKICByZXN1bHRzX3RjZ2EgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpCiAgCiAgIyBqb2luIHJlc3VsdHMKICBrZWVwX2NvbHMgPC0gYygicmVwIiwgInlfdGFzayIsICJtb2RlbCIsICJmaSIsICJpbmRleCIsICJ2YXIiLCAiaW1wb3J0YW5jZSIpCiAgcmVzdWx0cyA8LSBkcGx5cjo6YmluZF9yb3dzKAogICAgcmVzdWx0c19jY2xlICU+JSBkcGx5cjo6c2VsZWN0KHRpZHlzZWxlY3Q6OmFsbF9vZihrZWVwX2NvbHMpKSwKICAgIHJlc3VsdHNfdGNnYSAlPiUgZHBseXI6Om11dGF0ZSh5X3Rhc2sgPSAiVENHQS1CUkNBIikgJT4lIGRwbHlyOjpzZWxlY3QodGlkeXNlbGVjdDo6YWxsX29mKGtlZXBfY29scykpCiAgKSAlPiUKICAgIHRpYmJsZTo6YXNfdGliYmxlKCkKICBwbHRfbHMgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogICAgcmVzdWx0cywKICAgIGdyb3VwX2lkID0gInlfdGFzayIsCiAgICB0b3BfciA9IDEwLAogICAgc2hvd19tYXhfZmVhdHVyZXMgPSA1LAogICAgYmFzZV9tZXRob2QgPSAiTURJKyAocmlkZ2UpIiwKICAgIHJldHVybl9kZiA9IEZBTFNFLAogICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSByZXYobWFudWFsX2NvbG9yX3BhbGV0dGUpLAogICAgc2hvd19tZXRob2RzID0gcmV2KHNob3dfbWV0aG9kcyksCiAgICBtZXRob2RfbGFiZWxzID0gcmV2KG1ldGhvZF9sYWJlbHMpCiAgKQogIAogIHBsdCA8LSBwbHRfbHMkU3VtbWFyeSArCiAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICB5ID0gIkRydWciLAogICAgICB4ID0gIk51bWJlciBvZiBEaXN0aW5jdCBGZWF0dXJlcyBpbiBUb3AgMTAgQWNyb3NzIDMyIFRyYWluaW5nLVRlc3QgU3BsaXRzIgogICAgKSArCiAgICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgIG4uYnJlYWtzID0gNgogICAgKQogIGdncGxvdDI6Omdnc2F2ZShwbHQsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiY2FzZXN0dWR5X3N0YWJpbGl0eV90b3AxMC5wZGYiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS41LCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMS4yKQogIAogIGtlZXBfbWV0aG9kcyA8LSBjKCJNREkrX3JpZGdlIiwgIk1ESStfbG9naXN0aWNfbG9nbG9zcyIsICJNREEiLCAiTURJIiwgIlRyZWVTSEFQIikKICBtYW51YWxfY29sb3JfcGFsZXR0ZV9zbWFsbCA8LSBtYW51YWxfY29sb3JfcGFsZXR0ZVtzaG93X21ldGhvZHMgJWluJSBrZWVwX21ldGhvZHNdCiAgc2hvd19tZXRob2RzX3NtYWxsIDwtIHNob3dfbWV0aG9kc1tzaG93X21ldGhvZHMgJWluJSBrZWVwX21ldGhvZHNdCiAgbWV0aG9kX2xhYmVsc19zbWFsbCA8LSBtZXRob2RfbGFiZWxzW3Nob3dfbWV0aG9kcyAlaW4lIGtlZXBfbWV0aG9kc10KICAKICBwbHRfdGNnYSA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgICByZXN1bHRzX3RjZ2EsCiAgICB0b3BfciA9IDEwLAogICAgc2hvd19tYXhfZmVhdHVyZXMgPSA1LAogICAgYmFzZV9tZXRob2QgPSAiTURJKyAocmlkZ2UpIiwKICAgIHJldHVybl9kZiA9IEZBTFNFLAogICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZV9zbWFsbCwKICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kc19zbWFsbCwKICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzX3NtYWxsCiAgKSRgU3RhYmlsaXR5IG9mIFRvcCBGZWF0dXJlc2AgKwogICAgZ2dwbG90Mjo6bGFicyh0aXRsZSA9ICJUQ0dBLUJSQ0EiKSArIAogICAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogIAogIHBsdF9scyA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgICByZXN1bHRzX2NjbGUsCiAgICBncm91cF9pZCA9ICJ5X3Rhc2siLAogICAgdG9wX3IgPSAxMCwKICAgIHNob3dfbWF4X2ZlYXR1cmVzID0gNSwKICAgICMgdmFybmFtZXMgPSBjb2xuYW1lcyhYKSwKICAgIGJhc2VfbWV0aG9kID0gIk1ESSsgKHJpZGdlKSIsCiAgICByZXR1cm5fZGYgPSBGQUxTRSwKICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGVfc21hbGxbc2hvd19tZXRob2RzX3NtYWxsICE9ICJNREkrX2xvZ2lzdGljX2xvZ2xvc3MiXSwKICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kc19zbWFsbFtzaG93X21ldGhvZHNfc21hbGwgIT0gIk1ESStfbG9naXN0aWNfbG9nbG9zcyJdLAogICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHNfc21hbGxbc2hvd19tZXRob2RzX3NtYWxsICE9ICJNREkrX2xvZ2lzdGljX2xvZ2xvc3MiXQogICkKICAKICAjIGtlZXBfZHJ1Z3MgPC0gYygiUGFub2Jpbm9zdGF0IiwgIkxhcGF0aW5pYiIsICJMLTY4NTQ1OCIpCiAga2VlcF9kcnVncyA8LSBjKCJQRC0wMzI1OTAxIiwgIlBhbm9iaW5vc3RhdCIsICJMLTY4NTQ1OCIpCiAgc21hbGxfcGx0X2xzIDwtIGxpc3QoKQogIGZvciAoZHJ1ZyBpbiBrZWVwX2RydWdzKSB7CiAgICBwbHQgPC0gcGx0X2xzW1tkcnVnXV0KICAgIGlmIChkcnVnICE9IGtlZXBfZHJ1Z3NbMV0pIHsKICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgIH0KICAgIHNtYWxsX3BsdF9sc1tbZHJ1Z11dIDwtIHBsdCArCiAgICAgIGdncGxvdDI6Omd1aWRlcyhmaWxsID0gIm5vbmUiKQogIH0KICBzbWFsbF9wbHRfbHNbWyJUQ0dBLUJSQ0EiXV0gPC0gcGx0X3RjZ2EKICAjIHNtYWxsX3BsdF9sc1tbMV1dICsgc21hbGxfcGx0X2xzW1syXV0gKyBzbWFsbF9wbHRfbHNbWzNdXSArIHNtYWxsX3BsdF9sc1tbNF1dICsKICAjICAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChucm93ID0gMSwgbmNvbCA9IDQsIGd1aWRlcyA9ICJjb2xsZWN0IikKICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHNtYWxsX3BsdF9scywgbnJvdyA9IDEsIG5jb2wgPSA0LCBndWlkZXMgPSAiY29sbGVjdCIpICYKICAgIGdncGxvdDI6OnRoZW1lKAogICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGdncGxvdDI6OmVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksCiAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTk1Iiwgc2l6ZSA9IGdncGxvdDI6OnJlbCgwLjI1KSkKICAgICkKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImNhc2VzdHVkeV9zdGFiaWxpdHlfc2VsZWN0X2ZlYXR1cmVzLnBkZiIpLAogICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAwLjUpCiAgCiAgcGx0IDwtIHNtYWxsX3BsdF9sc1tbMV1dICsgc21hbGxfcGx0X2xzW1syXV0gKyBzbWFsbF9wbHRfbHNbWzNdXSArIHBhdGNod29yazo6cGxvdF9zcGFjZXIoKSArIHNtYWxsX3BsdF9sc1tbNF1dICsKICAgIHBhdGNod29yazo6cGxvdF9sYXlvdXQobnJvdyA9IDEsIHdpZHRocyA9IGMoMSwgMSwgMSwgMC4xLCAxKSwgZ3VpZGVzID0gImNvbGxlY3QiKQogICMgcGx0CiAgIyBncmlkOjpncmlkLmRyYXcoCiAgIyAgIGdyaWQ6OmxpbmVzR3JvYih4ID0gZ3JpZDo6dW5pdChjKDAuNjgsIDAuNjgpLCAibnBjIiksCiAgIyAgICAgICAgICAgICAgICAgICB5ID0gZ3JpZDo6dW5pdChjKDAuMDYsIDAuOTgpLCAibnBjIikpCiAgIyApCiAgIyAjIGdncGxvdDI6Omdnc2F2ZSgKICAjICMgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjYXNlc3R1ZHlfc3RhYmlsaXR5X3NlbGVjdF9mZWF0dXJlcy5wZGYiKSwKICAjICMgICB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IDQKICAjICMgKQp9CgpgYGAKCgojIE1pc3NwZWNpZmllZCBNb2RlbHMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjM1KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncF9vbWl0dGVkX3ZhcnMiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgibWRpX3BsdXMucmVncmVzc2lvbl9zaW1zLiIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZm9yIChoIGluIGhlcml0YWJpbGl0aWVzKSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJtaXNzcGVjaWZpZWRfcmVncmVzc2lvbl9zaW1zIiwgCiAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1pc3NwZWNpZmllZF9yZWdyZXNzaW9uX3NpbXNfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICApICsKICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgIH0KICB9Cn0KCmBgYAoKCiMgVmFyeWluZyBTcGFyc2l0eSB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuNykKCnlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQp4X21vZGVscyA8LSBjKCJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJzcGxpY2luZyIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoInNwbGljaW5nIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIHhfc3RyIDwtIGlmZWxzZSh5X21vZGVsID09ICJsaW5lYXIiLCAicyIsICJtIikKICAgIHZhcnlfcGFyYW1fbmFtZSA8LSBzcHJpbnRmKCJoZXJpdGFiaWxpdHlfJXMiLCB4X3N0cikKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJtZGlfcGx1cy5vdGhlcl9yZWdyZXNzaW9uX3NpbXMudmFyeWluZ19zcGFyc2l0eS4iLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9IHhfc3RyLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSB0b3VwcGVyKHhfc3RyKSwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgKQogICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgIH0KICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICB9CiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgInZhcnlpbmdfc3BhcnNpdHkiLCAKICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX3NwYXJzaXR5XyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IDMKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSB4X3N0ciwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gdG91cHBlcih4X3N0ciksIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgIH0KICB9Cn0KCmBgYAoKCiMgVmFyeWluZyBcIyBGZWF0dXJlcyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiaGVyaXRhYmlsaXR5X3NhbXBsZV9jb2xfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCnhfbW9kZWxzIDwtIGMoImNjbGVfcm5hc2VxIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIikKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0gYygiY2NsZV9ybmFzZXEiKQprZWVwX2xlZ2VuZF95X21vZGVscyA8LSBjKCJsaW5lYXIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJtZGlfcGx1cy5vdGhlcl9yZWdyZXNzaW9uX3NpbXMudmFyeWluZ19wLiIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZm9yIChoIGluIGhlcml0YWJpbGl0aWVzKSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9jb2xfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJOdW1iZXIgb2YgRmVhdHVyZXMiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICApCiAgICAgICAgaWYgKGggIT0gaGVyaXRhYmlsaXRpZXNbMV0pIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGlmICh5X21vZGVsICVpbiUgcmVtb3ZlX3hfYXhpc19tb2RlbHMpIHsKICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgIH0KICAgICAgICBpZiAoISgoaCA9PSBoZXJpdGFiaWxpdGllc1tsZW5ndGgoaGVyaXRhYmlsaXRpZXMpXSkgJiAKICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgfQogICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgIH0KICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAidmFyeWluZ19wIiwgCiAgICAgICAgICAgICAgICAgIHNwcmludGYoInJlZ3Jlc3Npb25fc2ltc192YXJ5X3BfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9jb2xfbiIsCiAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICApICsKICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgeCA9ICJOdW1iZXIgb2YgRmVhdHVyZXMiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICB9CiAgfQp9CgpgYGAKCgojIFByZWRpY3Rpb24gUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KZnBhdGhzIDwtIGMoCiAgIm1kaV9wbHVzLnByZWRpY3Rpb25fc2ltcy5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLSIsCiAgIm1kaV9wbHVzLnByZWRpY3Rpb25fc2ltcy5lbmhhbmNlcl9jbGFzc2lmaWNhdGlvbi0iLAogICJtZGlfcGx1cy5wcmVkaWN0aW9uX3NpbXMuc3BsaWNpbmdfY2xhc3NpZmljYXRpb24tIiwKICAibWRpX3BsdXMucHJlZGljdGlvbl9zaW1zLmp1dmVuaWxlX2NsYXNzaWZpY2F0aW9uLSIsCiAgIm1kaV9wbHVzLnByZWRpY3Rpb25fc2ltcy50Y2dhX2JyY2FfY2xhc3NpZmljYXRpb24tIgopCgprZWVwX21vZGVscyA8LSBjKCJSRiIsICJSRi1yaWRnZSIsICJSRi1sYXNzbyIsICJSRi1sb2dpc3RpYyIpCnByZWRpY3Rpb25fbWV0cmljcyA8LSBjKAogICJyMiIsICJleHBsYWluZWRfdmFyaWFuY2UiLCAibWVhbl9zcXVhcmVkX2Vycm9yIiwgIm1lYW5fYWJzb2x1dGVfZXJyb3IiLAogICJyb2NhdWMiLCAicHJhdWMiLCAiYWNjdXJhY3kiLCAiZjEiLCAicmVjYWxsIiwgInByZWNpc2lvbiIsICJhdmdfcHJlY2lzaW9uIiwgImxvZ2xvc3MiCikKCnJlc3VsdHNfbHMgPC0gbGlzdCgpCmZvciAoZnBhdGggaW4gZnBhdGhzKSB7CiAgZm5hbWUgPC0gZmlsZS5wYXRoKAogICAgcmVzdWx0c19kaXIsIAogICAgZnBhdGgsCiAgICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAgICJyZXN1bHRzLmNzdiIKICApCiAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgICByZWZvcm1hdF9yZXN1bHRzKHByZWRpY3Rpb24gPSBUUlVFKQogIAogIGlmICghKCJ5X3Rhc2siICVpbiUgY29sbmFtZXMocmVzdWx0cykpKSB7CiAgICByZXN1bHRzIDwtIHJlc3VsdHMgJT4lCiAgICAgIGRwbHlyOjptdXRhdGUoeV90YXNrID0gIlJlc3VsdHMiKQogIH0KICAKICBwbHRfZGYgPC0gcmVzdWx0cyAlPiUKICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoCiAgICAgIGNvbHMgPSB0aWR5c2VsZWN0Ojphbnlfb2YocHJlZGljdGlvbl9tZXRyaWNzKSwgCiAgICAgIG5hbWVzX3RvID0gIm1ldHJpYyIsIHZhbHVlc190byA9ICJ2YWx1ZSIKICAgICkgJT4lIAogICAgZHBseXI6Omdyb3VwX2J5KHlfdGFzaywgbW9kZWwsIG1ldHJpYykgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXNlKAogICAgICBtZWFuID0gbWVhbih2YWx1ZSksCiAgICAgIHNkID0gc2QodmFsdWUpLAogICAgICBuID0gZHBseXI6Om4oKQogICAgKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoCiAgICAgIHNlID0gc2QgLyBzcXJ0KG4pCiAgICApCiAgCiAgaWYgKGZwYXRoID09ICJtZGlfcGx1cy5wcmVkaWN0aW9uX3NpbXMuY2NsZV9ybmFzZXFfcmVncmVzc2lvbiIpIHsKICAgIHRhYiA8LSBwbHRfZGYgJT4lCiAgICAgIGRwbHlyOjptdXRhdGUoCiAgICAgICAgdmFsdWUgPSBzcHJpbnRmKCIlLjNmICglLjNmKSIsIG1lYW4sIHNlKQogICAgICApICU+JQogICAgICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scyA9IG1vZGVsLCBuYW1lc19mcm9tID0gIm1ldHJpYyIsIHZhbHVlc19mcm9tID0gInZhbHVlIikgJT4lCiAgICAgIGRwbHlyOjphcnJhbmdlKGRwbHlyOjpkZXNjKGFjY3VyYWN5KSkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QobW9kZWwsIGFjY3VyYWN5LCBmMSwgcm9jYXVjLCBwcmF1YywgcHJlY2lzaW9uLCByZWNhbGwpICU+JQogICAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoZm9ybWF0ID0gImxhdGV4IikKICB9CiAgCiAgaWYgKGZwYXRoICE9ICJtZGlfcGx1cy5wcmVkaWN0aW9uX3NpbXMuY2NsZV9ybmFzZXFfcmVncmVzc2lvbi0iKSB7CiAgICByZXN1bHRzX2xzW1tmcGF0aF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihtb2RlbCAlaW4lIGMoIlJGIiwgIlJGLWxvZ2lzdGljIikpICU+JQogICAgICBkcGx5cjo6c2VsZWN0KG1vZGVsLCBtZXRyaWMsIG1lYW4pICU+JQogICAgICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scyA9IG1ldHJpYywgbmFtZXNfZnJvbSA9ICJtb2RlbCIsIHZhbHVlc19mcm9tID0gIm1lYW4iKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShkaWZmID0gYFJGLWxvZ2lzdGljYCAtIFJGLAogICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfZGlmZiA9IChgUkYtbG9naXN0aWNgIC0gUkYpIC8gYWJzKFJGKSAqIDEwMCkKICB9IGVsc2UgewogICAgcmVzdWx0c19sc1tbZnBhdGhdXSA8LSBwbHRfZGYgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIobW9kZWwgJWluJSBjKCJSRiIsICJSRi1yaWRnZSIpKSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCh5X3Rhc2ssIG1vZGVsLCBtZXRyaWMsIG1lYW4pICU+JQogICAgICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scyA9IGMoeV90YXNrLCBtZXRyaWMpLCBuYW1lc19mcm9tID0gIm1vZGVsIiwgdmFsdWVzX2Zyb20gPSAibWVhbiIpICU+JQogICAgICBkcGx5cjo6bXV0YXRlKGRpZmYgPSBgUkYtcmlkZ2VgIC0gUkYsCiAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9kaWZmID0gKGBSRi1yaWRnZWAgLSBSRikgLyBhYnMoUkYpICogMTAwKQogIH0KfQoKcGx0X3JlZyA8LSByZXN1bHRzX2xzJGBtZGlfcGx1cy5wcmVkaWN0aW9uX3NpbXMuY2NsZV9ybmFzZXFfcmVncmVzc2lvbi1gICU+JQogIGRwbHlyOjpmaWx0ZXIobWV0cmljID09ICJyMiIpICU+JQogIGRwbHlyOjpmaWx0ZXIoUkYgPiAwLjEpICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBtZXRyaWMgPSBpZmVsc2UobWV0cmljID09ICJyMiIsICJSLXNxdWFyZWQiLCBtZXRyaWMpCiAgKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBSRiwgeSA9IHBlcmNlbnRfZGlmZiwgbGFiZWwgPSB5X3Rhc2spICsKICBnZ3Bsb3QyOjpsYWJzKHggPSAiUkYgVGVzdCBSLXNxdWFyZWQiLCB5ID0gIiUgQ2hhbmdlIFVzaW5nIFJGKyAocmlkZ2UpIikgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZ3Bsb3QyOjpnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2dyZXBlbDo6Z2VvbV9sYWJlbF9yZXBlbChmaWxsID0gIndoaXRlIikgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofiBtZXRyaWMsIHNjYWxlcyA9ICJmcmVlIikgKwogIGN1c3RvbV90aGVtZQoKcGx0X3JlZ19hbGwgPC0gcmVzdWx0c19scyRgbWRpX3BsdXMucHJlZGljdGlvbl9zaW1zLmNjbGVfcm5hc2VxX3JlZ3Jlc3Npb24tYCAlPiUKICBkcGx5cjo6ZmlsdGVyKG1ldHJpYyA9PSAicjIiKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgbWV0cmljID0gaWZlbHNlKG1ldHJpYyA9PSAicjIiLCAiUi1zcXVhcmVkIiwgbWV0cmljKQogICkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gUkYsIHkgPSBwZXJjZW50X2RpZmYsIGxhYmVsID0geV90YXNrKSArCiAgZ2dwbG90Mjo6bGFicyh4ID0gIlJGIFRlc3QgUi1zcXVhcmVkIiwgeSA9ICIlIENoYW5nZSBVc2luZyBSRisgKHJpZGdlKSIpICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2dwbG90Mjo6Z2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdncmVwZWw6Omdlb21fbGFiZWxfcmVwZWwoZmlsbCA9ICJ3aGl0ZSIpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH4gbWV0cmljLCBzY2FsZXMgPSAiZnJlZSIpICsKICBjdXN0b21fdGhlbWUKCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgcGxvdCA9IHBsdF9yZWdfYWxsLCAKICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgInByZWRpY3Rpb25fcmVzdWx0c19hcHBlbmRpeC5wZGYiKSwKICAgIHVuaXRzID0gImluIiwgd2lkdGggPSA4LCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMC43NQogICkKfQoKcGx0X2xzIDwtIGxpc3QocmVnID0gcGx0X3JlZykKZm9yIChtIGluIGMoImYxIiwgInByYXVjIikpIHsKICBwbHRfZGYgPC0gZHBseXI6OmJpbmRfcm93cyhyZXN1bHRzX2xzLCAuaWQgPSAiZGF0YXNldCIpICU+JQogICAgZHBseXI6OmZpbHRlcihtZXRyaWMgPT0gbSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKAogICAgICBkYXRhc2V0ID0gc3RyaW5ncjo6c3RyX3JlbW92ZShkYXRhc2V0LCAiXm1kaV9wbHVzXFwucHJlZGljdGlvbl9zaW1zXFwuIikgJT4lCiAgICAgICAgc3RyaW5ncjo6c3RyX3JlbW92ZSgiX2NsYXNzaWZpY2F0aW9uLSQiKSAlPiUKICAgICAgICBzdHJpbmdyOjpzdHJfdG9fdGl0bGUoKSAlPiUKICAgICAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZSgiVGNnYV9icmNhIiwgIlRDR0EgQlJDQSIpLAogICAgICBkaWZmID0gaWZlbHNlKG1ldHJpYyA9PSAibG9nbG9zcyIsIC1kaWZmLCBkaWZmKSwKICAgICAgcGVyY2VudF9kaWZmID0gaWZlbHNlKG1ldHJpYyA9PSAibG9nbG9zcyIsIC1wZXJjZW50X2RpZmYsIHBlcmNlbnRfZGlmZiksCiAgICAgIG1ldHJpYyA9IGZvcmNhdHM6OmZjdF9yZWNvZGUobWV0cmljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2N1cmFjeSIgPSAiYWNjdXJhY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiZjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBMb2ctbG9zcyIgPSAibG9nbG9zcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFVUFJDIiA9ICJwcmF1YyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFVUk9DIiA9ICJyb2NhdWMiKQogICAgKQogIHBsdF9sc1tbbV1dIDwtIHBsdF9kZiAlPiUKICAgIGdncGxvdDI6OmdncGxvdCgpICsKICAgIGdncGxvdDI6OmFlcyh4ID0gUkYsIHkgPSBwZXJjZW50X2RpZmYsIGxhYmVsID0gZGF0YXNldCkgKwogICAgZ2dwbG90Mjo6bGFicyh4ID0gc3ByaW50ZigiUkYgVGVzdCAlcyIsIHBsdF9kZiRtZXRyaWNbMV0pLCAKICAgICAgICAgICAgICAgICAgeSA9ICIlIENoYW5nZSBVc2luZyBSRisgKGxvZ2lzdGljKSIpICsKICAgIGdncGxvdDI6Omdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdncGxvdDI6Omdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdncmVwZWw6Omdlb21fbGFiZWxfcmVwZWwocG9pbnQucGFkZGluZyA9IDAuNSwgZmlsbCA9ICJ3aGl0ZSIpICsKICAgIGdncGxvdDI6OmZhY2V0X3dyYXAofiBtZXRyaWMsIHNjYWxlcyA9ICJmcmVlIiwgbnJvdyA9IDEpICsKICAgIGN1c3RvbV90aGVtZQp9CgpwbHRfbHNbWzNdXSA8LSBwbHRfbHNbWzNdXSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQoKcGx0IDwtIHBsdF9sc1tbMV1dICsgcGF0Y2h3b3JrOjpwbG90X3NwYWNlcigpICsgcGx0X2xzW1syXV0gKyBwbHRfbHNbWzNdXSArCiAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChucm93ID0gMSwgd2lkdGhzID0gYygxLCAwLjMsIDEsIDEpKQoKIyBwbHQKIyBncmlkOjpncmlkLmRyYXcoCiMgICBncmlkOjpsaW5lc0dyb2IoeCA9IGdyaWQ6OnVuaXQoYygwLjM2LCAwLjM2KSwgIm5wYyIpLAojICAgICAgICAgICAgICAgICAgIHkgPSBncmlkOjp1bml0KGMoMC4wNiwgMC45OCksICJucGMiKSkKIyApCiMgIyBnZ3Bsb3QyOjpnZ3NhdmUoCiMgIyAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgInByZWRpY3Rpb25fcmVzdWx0c19tYWluLnBkZiIpLAojICMgICB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAwLjc1CiMgIyApCgp2dGhlbWVzOjpzdWJjaHVua2lmeShwbHQsIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCmNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCmBgYAoKCiMgTURJKyBNb2RlbGluZyBDaG9pY2VzIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXNbbWV0aG9kX2xhYmVsc19jaG9pY2VzID09ICJNREkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZV9jaG9pY2VzW21ldGhvZF9sYWJlbHNfY2hvaWNlcyA9PSAiTURJLW9vYiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICIjQUY0RDk4IiwgIiNGRkQ5MkYiLCAiI0ZDOEQ2MiIsICJibGFjayIpCnNob3dfbWV0aG9kcyA8LSBjKCJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJHTURJX3Jhd19SRiIsICJHTURJX2xvb19SRiIsICJHTURJX29sc19yYXdfbG9vX1JGIiwgIkdNRElfcmlkZ2VfcmF3X2xvb19SRiIpCm1ldGhvZF9sYWJlbHMgPC0gYygiTURJIiwgIk1ESS1vb2IiLCAiTURJKyAocmF3IG9ubHkpIiwgIk1ESSsgKGxvbyBvbmx5KSIsICJNREkrIChyYXcrbG9vIG9ubHkpIiwgIk1ESSsgKHJpZGdlK3Jhdytsb28pIikKYWxwaGFfdmFsdWVzIDwtIHJlcCgxLCBsZW5ndGgobWV0aG9kX2xhYmVscykpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNjMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiaGVyaXRhYmlsaXR5X3NhbXBsZV9yb3dfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImhpZXJfcG9seV8zbV8yciIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikjLCAic3BsaWNpbmciKQptaW5fc2FtcGxlc19wZXJfbGVhZnMgPC0gYyg1LCAxKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygiZW5oYW5jZXIiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LWNpcmNsZX1cblxuIiwgeF9tb2RlbCkpCiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBmb3IgKG1pbl9zYW1wbGVzX3Blcl9sZWFmIGluIG1pbl9zYW1wbGVzX3Blcl9sZWFmcykgewogICAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyMgbWluX3NhbXBsZXNfcGVyX2xlYWYgPSAlcyBcblxuIiwgbWluX3NhbXBsZXNfcGVyX2xlYWYpKQogICAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICAgKQogICAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICAgICkKICAgICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1kaV9wbHVzLm90aGVyX3JlZ3Jlc3Npb25fc2ltcy5tb2RlbGluZ19jaG9pY2VzX21pbl9zYW1wbGVzJXMuJXMiLCBtaW5fc2FtcGxlc19wZXJfbGVhZiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgICAgaWYgKCFmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpKSB7CiAgICAgICAgbmV4dAogICAgICB9CiAgICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OnRoZW1lKAogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMikKICAgICAgICAgICAgKQogICAgICAgICAgaWYgKGggIT0gaGVyaXRhYmlsaXRpZXNbMV0pIHsKICAgICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICAgIH0KICAgICAgICAgIGlmICh4X21vZGVsICVpbiUgcmVtb3ZlX3hfYXhpc19tb2RlbHMpIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgICB9CiAgICAgICAgICBpZiAoISgoaCA9PSBoZXJpdGFiaWxpdGllc1tsZW5ndGgoaGVyaXRhYmlsaXRpZXMpXSkgJiAKICAgICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgICB9CiAgICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICAgIH0KICAgICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAibW9kZWxpbmdfY2hvaWNlcyIsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX2Nob2ljZXNfbWluX3NhbXBsZXMlc18lc18lc18lc19lcnJiYXJzLnBkZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2FtcGxlc19wZXJfbGVhZiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICAgICkKICAgICAgfSBlbHNlIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoKCiMgTURJKyBHTE0vTWV0cmljIENob2ljZXMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKIyMgSGVsZC1vdXQgVGVzdCBQcmVkaWN0aW9uIFNjb3JlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoIiNBNUFFOUUiLCAiYmxhY2siLCAiYnJvd24iKQpzaG93X21ldGhvZHMgPC0gYygiUkYiLCAiUkYtcmlkZ2UiLCAiUkYtbGFzc28iKQptZXRob2RfbGFiZWxzIDwtIGMoIlJGIiwgIlJGK3JpZGdlIiwgIlJGK2xhc3NvIikKYWxwaGFfdmFsdWVzIDwtIHJlcCgxLCBsZW5ndGgobWV0aG9kX2xhYmVscykpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNjMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiaGVyaXRhYmlsaXR5X3NhbXBsZV9yb3dfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImhpZXJfcG9seV8zbV8yciIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikjLCAic3BsaWNpbmciKQpwcmVkaWN0aW9uX21ldHJpY3MgPC0gYygKICAicjIiICMsICJtZWFuX2Fic29sdXRlX2Vycm9yIgogICMgInJvY2F1YyIsICJwcmF1YyIsICJhY2N1cmFjeSIsICJmMSIsICJyZWNhbGwiLCAicHJlY2lzaW9uIiwgImF2Z19wcmVjaXNpb24iLCAibG9nbG9zcyIKKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygiZW5oYW5jZXIiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtY2lyY2xlfVxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIAogICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1kaV9wbHVzLmdsbV9tZXRyaWNfY2hvaWNlc19zaW1zLnJlZ3Jlc3Npb25fcHJlZGljdGlvbl9zaW1zLiVzIiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKCFmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpKSB7CiAgICAgIG5leHQKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMocHJlZGljdGlvbiA9IFRSVUUpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKHByZWRpY3Rpb24gPSBUUlVFKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGZvciAobSBpbiBwcmVkaWN0aW9uX21ldHJpY3MpIHsKICAgICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICBtID09ICJyMiIgfiAiUi1zcXVhcmVkIiwKICAgICAgICBtID09ICJtYWUiIH4gIk1lYW4gQWJzb2x1dGUgRXJyb3IiCiAgICAgICkKICAgICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbSwKICAgICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpCiAgICAgICAgICAgICkKICAgICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgICAgfQogICAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgICB9CiAgICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgImdsbV9tZXRyaWNfY2hvaWNlcyIsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX2dsbV9tZXRyaWNfY2hvaWNlc19wcmVkaWN0aW9uXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG0pKSwKICAgICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICAgKQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoKIyMgU3RhYmlsaXR5IFNjb3JlcyAtIFJlZ3Jlc3Npb24gey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICJibGFjayIsICJicm93biIsICJicm93biIsICJncmF5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXNbbWV0aG9kX2xhYmVsc19jaG9pY2VzID09ICJNREkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESS1vb2IiXSkKc2hvd19tZXRob2RzIDwtIGMoIkdNRElfcmlkZ2VfcjJfUkYiLCAiR01ESV9yaWRnZV9uZWdfbWFlX1JGIiwgIkdNRElfbGFzc29fcjJfUkYiLCAiR01ESV9sYXNzb19uZWdfbWFlX1JGIiwgIkdNRElfZW5zZW1ibGVfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiKQptZXRob2RfbGFiZWxzIDwtIGMoIk1ESSsgKHJpZGdlLCByLXNxdWFyZWQpIiwgIk1ESSsgKHJpZGdlLCBNQUUpIiwgIk1ESSsgKGxhc3NvLCByLXNxdWFyZWQpIiwgIk1ESSsgKGxhc3NvLCBNQUUpIiwgIk1ESSsgKGVuc2VtYmxlKSIsICJNREkiLCAiTURJLW9vYiIpCm1hbnVhbF9saW5ldHlwZV9wYWxldHRlIDwtIGMoMSwgMiwgMSwgMiwgMSwgMSwgMSkKYWxwaGFfdmFsdWVzIDwtIGMocmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpLCByZXAoMC40LCAyKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC42MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgojIHlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQojIHhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIiwgImp1dmVuaWxlIiwgInNwbGljaW5nIikKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImhpZXJfcG9seV8zbV8yciIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKIyBzdGFiaWxpdHlfbWV0cmljcyA8LSBjKCJ0YXVBUCIsICJSQk8iKQpzdGFiaWxpdHlfbWV0cmljcyA8LSBjKCJSQk8iKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gbWV0cmljCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIHhfbW9kZWxzCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIHlfbW9kZWxzCmtlZXBfbGVnZW5kX21ldHJpY3MgPC0gbWV0cmljCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtY2lyY2xlfVxuXG4iLCB4X21vZGVsKSkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIAogICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1kaV9wbHVzLmdsbV9tZXRyaWNfY2hvaWNlc19zaW1zLnJlZ3Jlc3Npb25fc2ltcy4lcyIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmICghZmlsZS5leGlzdHMoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSkgewogICAgICBuZXh0CiAgICB9CiAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIGZvciAobSBpbiBjKG1ldHJpYywgc3RhYmlsaXR5X21ldHJpY3MpKSB7CiAgICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgbSA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgICAgbSA9PSAicHJhdWMiIH4gIlBSQVVDIiwKICAgICAgICBUUlVFIH4gbQogICAgICApCiAgICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgICAgZm9yIChoIGluIGhlcml0YWJpbGl0aWVzKSB7CiAgICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICAgIG1ldHJpYyA9IG0sCiAgICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICAgIGxpbmV0eXBlX3N0ciA9ICJtZXRob2QiLAogICAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IEZBTFNFCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsIGxpbmV0eXBlID0gIk1ldGhvZCIKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OnNjYWxlX2xpbmV0eXBlX21hbnVhbCgKICAgICAgICAgICAgICB2YWx1ZXMgPSBtYW51YWxfbGluZXR5cGVfcGFsZXR0ZSwgbGFiZWxzID0gbWV0aG9kX2xhYmVscwogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gZ2dwbG90Mjo6dW5pdCgxLjksICJjbSIpCiAgICAgICAgICAgICkKICAgICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAobSAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykgJgogICAgICAgICAgICAgICAgKG1ldHJpYyAlaW4lIGtlZXBfbGVnZW5kX21ldHJpY3MpKSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIiwgbGluZXR5cGUgPSAibm9uZSIpCiAgICAgICAgICB9CiAgICAgICAgICBwbHRfbHNbW3NwcmludGYoIiVzXyVzIiwgYXMuY2hhcmFjdGVyKGgpLCBtKV1dIDwtIHBsdAogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbSwKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgICAgbGluZXR5cGVfc3RyID0gIm1ldGhvZCIsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwgbGluZXR5cGUgPSAiTWV0aG9kIiwKICAgICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKAogICAgICAgICAgICB2YWx1ZXMgPSBtYW51YWxfbGluZXR5cGVfcGFsZXR0ZSwgbGFiZWxzID0gbWV0aG9kX2xhYmVscwogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMS45LCAiY20iKQogICAgICAgICAgKQogICAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuNSkKICAgICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgICB9CiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBucm93cyA8LSBsZW5ndGgoYyhtZXRyaWMsIHN0YWJpbGl0eV9tZXRyaWNzKSkKICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSBucm93cywgZ3VpZGVzID0gImNvbGxlY3QiKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiZ2xtX21ldHJpY19jaG9pY2VzIiwKICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX2dsbV9tZXRyaWNfY2hvaWNlc19zdGFiaWxpdHlfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQgKiAxLjIsIGhlaWdodCA9IGhlaWdodCAqIG5yb3dzCiAgICAgICkKICAgIH0KICB9Cn0KCmBgYAoKIyMgU3RhYmlsaXR5IFNjb3JlcyAtIENsYXNzaWZpY2F0aW9uIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiIzlCNURGRiIsICIjOUI1REZGIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZV9jaG9pY2VzW21ldGhvZF9sYWJlbHNfY2hvaWNlcyA9PSAiTURJLW9vYiJdKQpzaG93X21ldGhvZHMgPC0gYygiR01ESV9sb2dpc3RpY19yaWRnZV9sb2dsb3NzX1JGIiwgIkdNRElfbG9naXN0aWNfcmlkZ2VfYXVyb2NfUkYiLCAiR01ESV9yaWRnZV9yMl9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIpCm1ldGhvZF9sYWJlbHMgPC0gYygiTURJKyAobG9naXN0aWMsIGxvZy1sb3NzKSIsICJNREkrIChsb2dpc3RpYywgQVVST0MpIiwgIk1ESSsgKHJpZGdlLCByLXNxdWFyZWQpIiwgIk1ESSIsICJNREktb29iIikKbWFudWFsX2xpbmV0eXBlX3BhbGV0dGUgPC0gYygxLCAyLCAxLCAxLCAxKQphbHBoYV92YWx1ZXMgPC0gYyhyZXAoMSwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMiksIHJlcCgwLjQsIDIpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjYzLCAwLjQpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImZyYWNfbGFiZWxfY29ycnVwdGlvbl9zYW1wbGVfcm93X24iCiMgeV9tb2RlbHMgPC0gYygibG9naXN0aWMiLCAibHNzXzNtXzJyX2xvZ2lzdGljIiwgImhpZXJfcG9seV8zbV8ycl9sb2dpc3RpYyIsICJsaW5lYXJfbHNzXzNtXzJyX2xvZ2lzdGljIikKIyB4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCnlfbW9kZWxzIDwtIGMoImxvZ2lzdGljIiwgImhpZXJfcG9seV8zbV8ycl9sb2dpc3RpYyIpCnhfbW9kZWxzIDwtIGMoImp1dmVuaWxlIiwgInNwbGljaW5nIikKIyBzdGFiaWxpdHlfbWV0cmljcyA8LSBjKCJ0YXVBUCIsICJSQk8iKQpzdGFiaWxpdHlfbWV0cmljcyA8LSAiUkJPIgoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gbWV0cmljCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIHhfbW9kZWxzCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIHlfbW9kZWxzCmtlZXBfbGVnZW5kX21ldHJpY3MgPC0gbWV0cmljCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtY2lyY2xlfVxuXG4iLCB4X21vZGVsKSkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIAogICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIm1kaV9wbHVzLmdsbV9tZXRyaWNfY2hvaWNlc19zaW1zLmNsYXNzaWZpY2F0aW9uX3NpbXMuJXMiLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoIWZpbGUuZXhpc3RzKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkpIHsKICAgICAgbmV4dAogICAgfQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBmb3IgKG0gaW4gYyhtZXRyaWMsIHN0YWJpbGl0eV9tZXRyaWNzKSkgewogICAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIG0gPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICAgIG0gPT0gInByYXVjIiB+ICJQUkFVQyIsCiAgICAgICAgVFJVRSB+IG0KICAgICAgKQogICAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICAgIGZvciAoaCBpbiBmcmFjX2xhYmVsX2NvcnJ1cHRpb25zKSB7CiAgICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgICAgZHBseXI6OmZpbHRlcihmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbSwKICAgICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgICAgbGluZXR5cGVfc3RyID0gIm1ldGhvZCIsCiAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gRkFMU0UKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwgbGluZXR5cGUgPSAiTWV0aG9kIgogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKAogICAgICAgICAgICAgIHZhbHVlcyA9IG1hbnVhbF9saW5ldHlwZV9wYWxldHRlLCBsYWJlbHMgPSBtZXRob2RfbGFiZWxzCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSBnZ3Bsb3QyOjp1bml0KDEuOSwgImNtIikKICAgICAgICAgICAgKQogICAgICAgICAgaWYgKGggIT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKG0gJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGZyYWNfbGFiZWxfY29ycnVwdGlvbnNbbGVuZ3RoKGZyYWNfbGFiZWxfY29ycnVwdGlvbnMpXSkgJiAKICAgICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSAmCiAgICAgICAgICAgICAgICAobWV0cmljICVpbiUga2VlcF9sZWdlbmRfbWV0cmljcykpKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiLCBsaW5ldHlwZSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbc3ByaW50ZigiJXNfJXMiLCBhcy5jaGFyYWN0ZXIoaCksIG0pXV0gPC0gcGx0CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiZnJhY19sYWJlbF9jb3JydXB0aW9uX25hbWUiLAogICAgICAgICAgICBsaW5ldHlwZV9zdHIgPSAibWV0aG9kIiwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLCBsaW5ldHlwZSA9ICJNZXRob2QiLAogICAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpzY2FsZV9saW5ldHlwZV9tYW51YWwoCiAgICAgICAgICAgIHZhbHVlcyA9IG1hbnVhbF9saW5ldHlwZV9wYWxldHRlLCBsYWJlbHMgPSBtZXRob2RfbGFiZWxzCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OnRoZW1lKAogICAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gZ2dwbG90Mjo6dW5pdCgxLjksICJjbSIpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS41KQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIG5yb3dzIDwtIGxlbmd0aChjKG1ldHJpYywgc3RhYmlsaXR5X21ldHJpY3MpKQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IG5yb3dzLCBndWlkZXMgPSAiY29sbGVjdCIpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJnbG1fbWV0cmljX2Nob2ljZXMiLAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJjbGFzc2lmaWNhdGlvbl9zaW1zX2dsbV9tZXRyaWNfY2hvaWNlc19zdGFiaWxpdHlfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQgKiAxLjIsIGhlaWdodCA9IGhlaWdodCAqIG5yb3dzCiAgICAgICkKICAgIH0KICB9Cn0KCmBgYAo=